# 基础功能
# 数组基础知识
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]