2026a

# 基础功能


# 数组基础知识

M 语言

M 语言中,所有的变量都是以数组形式表示。

size(1)
ans =

     1     1

Julia 语言

Syslab 中的变量都有明确的类型,每种类型都有对应明确的数学定义,数组类型就分为向量(一维数组)、矩阵(二维数组)、多维数组。

size(1)
()

# 数组创建

M 语言

M 语言中,存在行向量和列向量的差异,使用空格或逗号分隔行的元素,使用分号分隔列的元素。

[1,2,3,4]
ans =

      1     2     3     4
[1 2 3 4]
ans =

      1     2     3     4
[1;2;3;4]
ans =

      1
      2
      3
      4

创建矩阵时,M 语言允许使用空格或逗号与分号组合。

a = [1,3,5; 2,4,6; 7,8,10]
a =

     1     3     5
     2     4     6
     7     8    10

Julia 语言

在 Julia 语言中,要创建一个长度为 4 的向量,请使用 (,) 分隔各元素。

a = [1,2,3,4]
4-element Vector{Int64}:
  1
  2
  3
  4

要创建每行包含四个元素的数组,请使用空格分隔各元素。

a = [1 2 3 4]
1×4 Matrix{Int64}:
1  2  3  4

这种数组为 1×4 矩阵,数据类型为 Int64。构造 4 × 1 矩阵,通常需要使用 reshape 或 Matrix 等函数构造。

a = reshape([1,2,3,4],4,1)
4×1 Matrix{Int64}:
 1
 2
 3
 4
a = Matrix([1 2 3 4]')
4×1 Matrix{Int64}:
 1
 2
 3
 4

要创建包含多行的矩阵,请使用分号分隔各行。

a = [1 3 5; 2 4 6; 7 8 10]
3×3 Matrix{Int64}:
 1  3   5
 2  4   6
 7  8  10

# 数组运算

M 语言

M 语言中允许使用单一的算术运算符或函数来处理矩阵中的所有值。

a = [1,3,5; 2,4,6; 7,8,10];
a + 10
ans =
11 13 15 
12 14 16 
17 18 20
sin(a)
ans =
0.8415 0.1411 -0.9589 
0.9093 -0.7568 -0.2794 
0.6570 0.9894 -0.5440

要转置矩阵,请使用单引号 ('):

a'
ans =
1 2 7 
3 4 8 
5 6 10

Julia 语言

Syslab 中的函数大体可以分为标量计算函数和数组计算函数,即以标量或数组作为目标进行计算。标量计算函数在传入数组时是无法计算的,需要搭配 (.) 运算符或 (@. 宏来计算)。

a = [1 3 5; 2 4 6; 7 8 10]
a+10

直接运行上述代码会报错提示,如果是矩阵和标量相加的话,需要加 (.) 运算符。故而应该将代码改为以下两种形式:

a .+ 10
3×3 Matrix{Int64}:
 11  13  15
 12  14  16
 17  18  20
@. a + 10
3×3 Matrix{Int64}:
 11  13  15
 12  14  16
 17  18  20
sin(a)
3×3 Matrix{Float64}:
-0.657343  -0.275398   0.014688
 -0.572697  -0.24759   -0.144781
 0.254022  -0.38759   -0.874514

直接运行上述代码会得到结果,但并不是对数组中每个元素求正弦值的结果,而是矩阵正弦值(详情请见:https://zhuanlan.zhihu.com/p/547214016 )。如果想要对矩阵中元素求正弦,请搭配 (.) 符号或 (@.) 宏来计算。

sin.(a)
3×3 Matrix{Int64}:
 0.841471   0.14112   -0.958924 
 0.909297  -0.756802  -0.279415
 0.656987   0.989358  -0.544021
@. sin(a)
3×3 Matrix{Int64}:
 0.841471   0.14112   -0.958924 
 0.909297  -0.756802  -0.279415
 0.656987   0.989358  -0.544021

# 串联

串联是连接数组以便形成更大数组的过程。

M 语言

M 语言中使用逗号将彼此相邻的数组串联起来称为水平串联。每个数组必须具有相同的行数。同样,如果各数组具有相同的列数,则可以使用分号垂直串联。

a = [1,3,5; 2,4,6; 7,8,10];
A = [a,a]
A =
1 3 5 1 3 5 
2 4 6 2 4 6 
7 8 10 7 8 10
A = [a; a]
A =
1 3 5 
2 4 6 
7 8 10 
1 3 5 
2 4 6 
7 8 10

Julia 语言

Julia 中成对的方括号 [] 即为串联运算符。使用空格将彼此相邻的数组串联起来称为水平串联。每个数组必须具有相同的行数。同样,如果各数组具有相同的列数,则可以使用分号直串联。

a = [1 3 5; 2 4 6; 7 8 10]
A = [a a]
A=
3×6 Matrix{Int64}:
 1  3   5  1  3   5
 2  4   6  2  4   6
 7  8  10  7  8  10

直接运行上述代码会报错提示,如果是矩阵和标量相加的话,需要加 (.) 运算符。故而应该将代码改为以下两种形式:

A = [a;a]
A=
6×3 Matrix{Int64}:
 1  3   5
 2  4   6
 7  8  10
 1  3   5
 2  4   6
 7  8  10

在 Syslab 中可以使用 hcat、vcat 函数分别进行水平、垂直拼接串联。

A = hcat(a,a)
A=
3×6 Matrix{Int64}:
 1  3   5  1  3   5
 2  4   6  2  4   6
 7  8  10  7  8  10
A = vcat(a,a)
A=
6×3 Matrix{Int64}:
 1  3   5
 2  4   6
 7  8  10
 1  3   5
 2  4   6
 7  8  10

# 复数

复数包含实部和虚部,虚数单位是 -1 的平方根。

M 语言

M 语言中使用 i 或 j 作为复数虚部单位。

c = [3+4i, 4+3j; -i, 10j]
c=
3.0000 + 4.0000i 4.0000 + 3.0000i 
0.0000 - 1.0000i 0.0000 +10.0000i
sqrt(-1) 
ans = 0.0000 + 1.0000i

Julia 语言

Julia 语言中使用 im 作为复数虚部单位。

c = [3+4im  4+3im; -im  10im]
c=
2×2 Matrix{Complex{Int64}}:
 3+4im  4+3im
 0-1im  0+10im
sqrt(-1 + 0im)
0.0 + 1.0im

在 Syslab 中,数据类型被分为 Real 和 Complex 两种,通常复数域的计算在输入为 Real 类型时会报错,需要将输入的 Real 类型通过 complex、+0im、Complex 的方式转换为 Complex 类型。

# 数组索引

M 语言

在 M 语言中的每个变量都是一个可包含许多数字的数组。使用 () 方式进行索引。

例如,假设有 4×4 矩阵 A:

A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
A=
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16

引用数组中的特定元素有两种方法。最常见的方法是指定行和列下标,例如

A(4,2)
ans = 14

另一种方法不太常用,但有时非常有用,即使用单一下标按顺序向下遍历每一列:

A(8)
ans = 14

可以在赋值语句左侧指定当前维外部的元素。数组大小会增大以便容纳新元素。

A(4,5) = 17
A =
1 2 3 4 0 
5 6 7 8 0 
9 10 11 12 0 
13 14 15 16 17

Julia 语言

Syslab 中的变量都有明确的类型,每种类型都有对应的明确的数学定义,数组类型就分为向量(一维数组)、矩阵(二维数组)、多维数组。如果要访问数组的选定元素,使用 [] 进行索引。

例如,假设有 4×4 矩阵 A:

A = [1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16]
A=
4×4 Matrix{Int64}:
  1   2   3   4
  5   6   7   8
  9  10  11  12
  13  14  15  16

引用数组中的特定元素有两种方法。最常见的方法是指定行和列下标,例如:

A[4,2]
14

使用单一下标按顺序向下遍历每一列:

A[8]
14

使用单一下标引用数组中特定元素的方法称为线性索引。如果 A 是一个向量,则只能使用线性索引,如果 A 是一个多维数组,则可以指定各个维度的位置进行索引。

如果 B 是向量:

B = [1,2,3,4,5]
B[3]
3

如果 C 是一个三维数组:

C = zeros(10,3,9)
C[3,2,1]
0.0

如果线性索引超过数组总长度或指定维度索引超过各维度长度,Syslab 会引发错误。

A[5,5]
ERROR: BoundsError: attempt to access 4×4 Matrix{Int64} at index [5, 5]

由于数组索引无法超过数组本身维度,所以无法利用数组索引方式扩充数组,请尝试使用串联方式扩充数组。

# Any 数组

M 语言

在 M 语言中使用 cell 存储任意类型的数据。

A = cell(1,3);   % 创建一个 1x3 的 cell array
A{1} = [1,3,5];  % 向量
A{2} = 'Syslab'; % 字符串
A{3} = [1 2; 3 4] % 矩阵
A =

  1×3 cell 数组

    {[1 3 5]}    {'Syslab'}    {2×2 double}

Julia 语言

在 Julia 中可以使用 Any 数组存储任意类型数据,即在 Any 数组中允许存放不同类型的数据,但 Any 数组作为容器仍必须遵守数组类型规则。

A = Vector{Any}(undef,3)
A[1] = [1,3,5]
A[2] = "Syslab"
A[3] = [1 2 ;3 4]
A
A=
3-element Vector{Any}:
 [1, 3, 5]
 "Syslab"
 [1 2; 3 4]

# 文本和字符

# 字符串中的文本

M 语言

当处理文本时,将字符序列括在双引号中。可以将文本赋给变量。

t = "Hello, world";

如果文本包含双引号,请在定义中使用两个双引号。

q = "Something ""quoted"" and something else."
q = 
"Something "quoted" and something else."

在 M 语言中,t 和 q 是数组。要将文本添加到字符串的末尾,请使用加号运算符 +。

f = 71; 
c = (f-32)/1.8; 
tempText = "Temperature is " + c + "C"
tempText = 
"Temperature is 21.6667C"

与数值数组类似,字符串数组可以有多个元素。使用 strlength 函数求数组中每个字符串的长度。

A = ["a","bb","ccc"; "dddd","eeeeee","fffffff"]
A = 

  2×3 string 数组

    "a"       "bb"        "ccc"    
    "dddd"    "eeeeee"    "fffffff"
strlength(A)
ans = 
1 2 3 
4 6 7

在 M 语言中,用单引号的变量为字符数组。

size('AB')
ans =

     1     2

Julia 语言

当您处理文本时,将字符括在双引号中形成字符串。可以将字符串赋给变量。

t = "Hello,world";

如果文本包含双引号,请在定义中使用 \ 符号区分。

q = "Something \"quoted\" and something else."
println(q)
Something "quoted" and something else.

t 和 q 的类型为 String 即字符串。要将文本添加到字符串的末尾,请使用乘法运算符 (*)。

f = 71
c = (f - 32) / 1.8
tempText = "Temperature is" * c * "C"

运行上述代码会报错,这是因为乘法运算符并不允许直接将数值与字符串进行拼接,故而需要对数值进行转换,可以使用 string 函数或 ($) 符号进行转换。

c_str1 = string(c)
"21.666666666666668"
c_str2 = "$c"
"21.666666666666668"
tempText = "Temperature is " * string(c) * "C"
"Temperature is 21.666666666666668C"

与数值数组类似,字符串数组可以有多个元素,使用 length 和 (.) 符号,求数组中每个字符串的长度。

A = ["a" "bb" "ccc"; "dddd" "eeeeee" "fffffff"]
2×3 Matrix{String}:
 "a"     "bb"      "ccc"
 "dddd"  "eeeeee"  "fffffff"
length.(A)
2×3 Matrix{Int64}:
 1  2  3
 4  6  7

在 Syslab 中,用单引号的变量为单个字符,而非字符数组,单引号中只能存放一个字符。

c_1 = 'A'
'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)

如果存放多个字符,则会报出错误。

c_2 = 'AB'
ERROR: syntax: character literal contains multiple characters

# 字符串中的数据

M 语言

当处理文本时,将字符序列括在双引号中。可以将文本赋给变量。

seq = 'GCTAGAATCC';
whos seq
  Name      Size            Bytes  Class    Attributes

  seq       1x10               20  char  

数组的每个元素都包含单个字符。

seq(4)
ans = 'A'

使用方括号串联字符数组,就像串联数值数组一样。

seq2 = [seq 'ATTAGAAACC']
seq2 = 
'GCTAGAATCCATTAGAAACC'

Julia 语言

例如 DNA 序列。您可以将此类数据存储在数据类型为 String 的 字符串中,字符串每个元素都包含单个字符。

seq = "GCTAGAATCC"
seq[4]
'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)

如果索引单个字符的话,结果返回为字符类型,即 Char 类型。如果需要结果返回为字符串,可以使用 (:) 进行索引,这和数组索引类似。

res1 = seq[4:4]
res2 = seq[4:6]
res1 = "A"
res2 = "AGA"

如果使用空格和 (;) 进行数组拼接,则会得到容器为数组,数据类型为字符串的字符串数组。

seq2 = [res1 res2]
seq3 = [res1 ; res2]
seq2 = 1×2 Matrix{String}:
 "A"  "AGA"

seq3 = 2-element Vector{String}:
 "A"
 "AGA"

# 函数调用

M 语言

如果存在多个输出参量,请将其括在方括号中:

A = [1 3 5];
[minA,maxA] = bounds(A)
minA = 1 
maxA = 5

要调用不需要任何输入的函数,不需要使用括号:

zeros
ans=
    0

Julia 语言

如果存在多个输出参量,不需要使用方括号或其他符号,直接写在等号左侧:

using TyStatistics
A = [1,3,5]
minA,maxA = bounds(A)
(1, 5)

要调用不需要任何输入的函数,同样需要使用括号:

zeros()
0-dimensional Array{Float64, 0}:
0.0

# 统计运行耗时

M 语言

在 M 语言中,通常使用 tic toc 或 timeit 统计函数或脚本运行耗时

tic;
for i =  1:1000
sin(i);
end
toc;
历时 0.003135 秒。
timeit(@() sin(5))
ans =
     1.142885000000000e-05

Julia 语言

在 Julia 语言中通常使用 @time 或 @elapsed 统计运行耗时

@time begin
for i = 1:1000
    sin(i)
end
end
0.000012 seconds
@elapsed sin(5)
1.0e-7

# 显示变量的值

M 语言

在 M 语言中,通常使用 disp 显示变量的值。

A = ones(2,2);
disp(A)
    1     1
    1     1

Julia 语言

在 Julia 语言中,通常使用 show 显示变量的值。

A = ones(2,2)
show(A)
[1.0 1.0; 1.0 1.0]