# 基本语法
本文描述了 TyMLang 的语法和数据类型的细节。
TyMLang 致力于提供尽可能高的 MATLAB 或 Octave 兼容性。 因此,对于熟悉 MATLAB 或 Octave 的用户,可以不需要阅读该页面就能使用 TyMLang 编写和使用代码。
# 常用命令
常用命令
| 类型名 | 说明 |
|---|---|
| ans | 最近计算的答案 |
| clear | 清除变量 |
| clc | 清空命令行窗口 |
| format | 设置命令行窗口输出显示格式 |
| iskeyword | 确定输入是否为 MLang 关键字 |
| cd | 更改当前文件夹 |
| pwd | 确定当前文件夹 |
| class | 对象的类 |
| who | 列出工作区中的变量 |
部分输入命令如下:
clear
语法
clear clear varname说明
clear 清除所有变量。clear varname 清除变量 varname。
示例
A = [1 2 3; 4 5 6; 7 8 9]A = 1 2 3 4 5 6 7 8 9clear A Atymlang.VarNotFound: 变量或函数 A 无法识别 at :1:1
format
语法:
format style format说明:
format style将命令行窗口中的输出显示格式更改为style指定的格式。示例:
format long pians =
3.141592653589793format short pians =
3.1416
pwd
语法
pwd currentFolder = pwd说明
pwd返回当前文件夹。示例
% 切换当前工作目录 cd 'e:/Temp' pwdans =
'e:\Temp'
# 基本类型
# 数值类型
数值类型
| 类型名 | 说明 |
|---|---|
| int8 | 8 位有符号整数数组 |
| int16 | 16 位有符号整数数组 |
| int32 | 32 位有符号整数数组 |
| int64 | 64 位有符号整数数组 |
| uint8 | 8 位无符号整数数组 |
| uint16 | 16 位无符号整数数组 |
| uint32 | 32 位无符号整数数组 |
| uint64 | 64 位无符号整数数组 |
| single | 单精度数组 |
| double | 双精度数组 |
| logical | 逻辑数组 |
部分数值类型示例如下:
double
- 语法
Y = double(X)- 说明
将 X 中的值转换为双精度
- 示例
x = true; y = double(x)y = 1single
语法
Y = single(X)说明
将 X 中的值转换为单精度
示例
x = true; y = single(x)y = 1x1 single 1
int64
语法
Y = int64(X)说明
将 X 中的值转换为 64 位有符号整数,超出范围的值映射到最近的端点
示例
x = 1.4; y = int64(x)y = 1x1 int64 1
小数及科学计数法
- 示例
x = 0.003x = 0.0030y = 3e-3y = 0.0030十六进制常量
- 示例
x = 0x12345678x = 1x1 uint32 305419896
# 字符和字符串
字符和字符串
| 类型名 | 说明 |
|---|---|
| char | 字符数组 |
| string | 字符串数组 |
char
语法
C = char(A)说明
字符数组
示例
C = 'Hello, world'C = 'Hello, world'A = [83 121 115 108 97 98]; C = char(A)C = 'Syslab'
string
语法
Y = string(X)说明
将 X 中的值转换为字符串数组
示例
str = "hello world!"str = "hello world!"x = 1; y = string(x)y = "1"
# 逻辑
true
语法
Y = true Y = true(n)说明
true 是逻辑值 1 的速记形式,true(n) 创建一个逻辑值为真的数组
示例
x = truex = 1x1 logical trueA = true(3)A = 3x3 logical true true true true true true true true true
false
语法
Y = false Y = false(n)说明
false 是逻辑值 0 的速记形式,false(n) 创建一个逻辑值为假的数组
示例
x = falsex = 1x1 logical falseA = false(3)A = 3x3 logical false false false false false false false false false
# 数组
# 创建数组
创建向量
x = [1,2,5]x = 1 2 5% 创建向量 x = [1 2] x = [1 +2]x = 1 2% 创建向量 x = [3] x = [1 + 2]x = 3创建矩阵
x = [1 2 3; 4 5 6]x = 1 2 3 4 5 6依据范围和步长创建数组
x = 1:10x = 1 2 3 4 5 6 7 8 9 10x = 1:2:10x = 1 3 5 7 9利用串联、并联创建数组
x = [1 2 3]; y = [4 5 6]; z = [x y]z = 1 2 3 4 5 6z = [x; y]z = 1 2 3 4 5 6函数创建数组
函数创建数组
| 函数 | 说明 |
|---|---|
| zeros | 创建全 0 数组 |
| ones | 创建全 1 数组 |
| rand | 创建随机数组 |
| eye | 创建单位矩阵 |
| diag | 创建对角矩阵 |
完整函数创建数组列表详见库函数帮助,部分函数示例如下:
zeros
语法
Y = zeros Y = zeros(n)说明
zeros 返回标量 0,zeros(n) 创建全 0 数组
示例
x = zerosx = 0y = zeros(2)y = 0 0 0 0
ones
语法
Y = ones Y = ones(n)说明
ones 返回标量 1,ones(n) 创建全 1 数组
示例
x = onesx = 1y = ones(2)y = 1 1 1 1
rand
语法
Y = rand Y = rand(n)说明
rand 返回一个区间在(0,1)的随机数,rand(n) 创建随机数组
示例
x = randx = 0.8147y = rand(2)y = 0.9058 0.9134 0.1270 0.6324
# 数组索引
位置索引
- 指定位置索引
x = [1 2 3; 4 5 6]; y = x(1,2)y = 2 - 切片索引
x = [1 2 3; 4 5 6]; y = x(1:2,2:3)y = 2 3 5 6
- 指定位置索引
线性索引
x = [1 2 3; 4 5 6]; y = x(4)y = 5end 关键字索引
x = [1 2 3; 4 5 6];
y = x(1, end)
y =
3
# 数组赋值
位置赋值
- 指定位置赋值
x = [1 2 3; 4 5 6]; x(1,2) = 10x = 1 10 3 4 5 6 - 切片赋值
x = [1 2 3; 4 5 6]; x(1:2,2:3) = 10x = 1 10 10 4 10 10
- 指定位置赋值
线性赋值
x = [1 2 3; 4 5 6]; x(4) = 10x = 1 2 3 4 10 6end 关键字赋值
x = [1 2 3; 4 5 6]; x(1,end) = 10x = 1 2 10 4 5 6
# 数组扩展
A = [10 20 30; 60 70 80];
A(3,4) = 1
A =
10 20 30 0
60 70 80 0
0 0 0 1
A(4,4:5) = [100 200]
A =
10 20 30 0 0
60 70 80 0 0
0 0 0 1 0
0 0 0 100 200
clear
A(1:3, :) = rand(3, 1)
A =
0.0975
0.2785
0.5469
# 元胞
# 创建元胞
- 创建元胞数组
x = {1,2,3}; y = {1,2,3;4,5,6}y = 2x3 cell {[1]} {[2]} {[3]} {[4]} {[5]} {[6]}
# 元胞索引
()元胞索引x = {1,2,3}; y = x(1)y = 1x1 cell {[1]}{}元胞索引x = {1,2,3}; y = x{1}y = 1
# 元胞赋值
()元胞赋值x = {1,2,3}; x(1) = {10}x = 1x3 cell {[10]} {[2]} {[3]}{}元胞赋值x = {1,2,3}; x{1} = 10x = 1x3 cell {[10]} {[2]} {[3]}
# 元胞扩展
x = {1,2,3};
x(2,2) = {100}
x =
2x3 cell
{[1]} {[2]} {[3]}
{0x0 double} {[100]} {0x0 double}
# 结构体
# 创建结构体
- 创建标量结构体
x = struct('a',1,'b',2)x = 1x1 struct a: [1] b: [2] - 创建结构体数组
patient(1).name = 'John Doe'; patient(1).billing = 127.00; patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205]; patient(2).name = 'Ann Lane'; patient(2).billing = 28.50; patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169]; patientpatient = 1x2 struct billing name test - 创建含有元胞的结构体
s.cell = {{'a','b','c'}}s = 1x1 struct cell: 1x1 cells.cell{1}ans = 1x3 cell {'a'} {'b'} {'c'}
# 结构体索引
- 结构体字段访问
x = struct('a',1,'b',2); y = x.ay = 1 - 结构体数组索引
patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205]; patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169]; patient(1).test(1,2)ans = 75patient(2).test(end)ans = 169
# 结构体赋值
- 结构体字段赋值
x = struct('a',1,'b',2); x.a = 10x = 1x1 struct a: [10] b: [2] - 结构体数组赋值
patient(1).name = 'John Doe'; patient(1).billing = 127.00; patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205]; patient(1).test(1,2) = 10; patient(1).testans = 79 10 73 180 178 177.5000 220 210 205
# 映射容器(实验性)
映射容器(实验性)
| 函数 | 说明 |
|---|---|
| containers_Map | 将值映射到唯一键的对象 |
| isKey | 确定 Map 对象是否包含键 |
| keys | 返回 Map 对象的键 |
| remove | 从 Map 对象中删除键-值对组 |
| values | 返回 Map 对象的值 |
containers_Map
语法
M = containers_Map(keySet,valueSet) M = containers_Map(keySet,valueSet,'UniformValues',isUniform) M = containers_Map('KeyType',kType,'ValueType',vType) M = containers_Map说明
将值映射到唯一键的对象。
注意:我们使用
containers_Map替代 Matlab 的containers.Map,实现同样功能。示例
创建映射
keySet = {'Jan','Feb','Mar','Apr'}; valueSet = [327.2 368.2 197.6 178.4]; M = containers_Map(keySet,valueSet)M = Map - 属性: Count: 4 KeyType: char ValueType: double将数字指定为键
ids = [437 1089 2362]; names = {'Lee, N.','Jones, R.','Sanchez, C.'}; M = containers_Map(ids,names); M(437)ans = 'Lee, N.'存储非统一值
keySet = {'Li','Jones','Sanchez'}; testLi = [5.8 7.35]; testJones = [27 3.92 6.4 8.21]; testSanchez = 'C:\Tests\Sanchez.dat'; valueSet = {testLi,testJones,testSanchez}; M = containers_Map(keySet,valueSet,'UniformValues',false)M = Map - 属性: Count: 3 KeyType: char ValueType: anyM('Li')ans = 5.8000 7.3500M('Sanchez')ans = 'C:\Tests\Sanchez.dat'指定空映射的类型
M = containers_Map('KeyType','char','ValueType','double'); M('Jan') = 327.2; M('Feb') = 368.2; MM = Map - 属性: Count: 2 KeyType: char ValueType: doublekeys(M)ans = 1x2 cell {'Jan'} {'Feb'}values(M)ans = 1x2 cell {[327.2000]} {[368.2000]}
# 运算符
# 算术运算
数组运算
数组运算
运算符 用途 说明 函数 +加法 A+B表示将A和B加在一起。plus +一元加法 +A表示返回A。uplus -减法 A-B表示从A中减去Bminus -一元减法 -A表示对A的元素求反。uminus .*按元素乘法 A.*B表示A和B的逐元素乘积。times .^按元素求幂 A.^B表示包含元素A(i,j)的B(i,j)次幂的矩阵。power ./数组右除 A./B表示包含元素A(i,j)/B(i,j)的矩阵。rdivide .\数组左除 A.\B表示包含元素B(i,j)/A(i,j)的矩阵。ldivide .'数组转置 A.'表示A的数组转置。对于复矩阵,这不涉及共轭。transpose 矩阵运算
矩阵运算
运算符 用途 说明 函数 *矩阵乘法 C =A*B表示矩阵A和B的线性代数乘积。A的列数必须与B的行数相等。mtimes \矩阵左除 x = A\B是方程 Ax = B 的解。矩阵A和B必须拥有相同的行数。mldivide /矩阵右除 x = B/A是方程 xA = B 的解。矩阵A和B必须拥有相同的列数。用左除运算符表示的话,B/A = (A'\B')'。mrdivide ^矩阵幂 A^B表示A的B次幂(如果B为标量)。对于B的其他值,计算包含特征值和特征向量。mpower '复共轭转置 A'表示A的线性代数转置。对于复矩阵,这是复共轭转置。ctranspose
部分运算符示例如下:
加法
语法
C = A + B C = plus(A, B)说明
C = A + B 通过对应元素相加将数组 A 和 B 相加。A 和 B 的大小必须相同或兼容
示例
A = [1 2 3; 4 5 6]; B = [1 2 3; 4 5 6]; C = A + BC = 2 4 6 8 10 12
数组乘法
语法
C = A .* B C = times(A, B)说明
C = A .* B 通过对应元素相乘将数组 A 和 B 相乘。A 和 B 的大小必须相同或兼容
示例
A = [1 0 3]; B = [2 3 7]; C = A.*BC = 2 0 21
数组右除
语法
C = A ./ B C = rdivide(A, B)说明
C = A ./ B 通过对应元素相除将数组 A 和 B 相除。A 和 B 的大小必须相同或兼容
示例
A = [2 4 6 8; 3 5 7 9]; B = 10*ones(2,4); x = A./Bx = 0.2000 0.4000 0.6000 0.8000 0.3000 0.5000 0.7000 0.9000
数组转置
语法
C = A.' C = transpose(A)说明
C = A.' 返回 A 的数组转置。对于复数矩阵,不涉及共轭
示例
A = [1+i 2 3; 4 5 6]; C = A.'C = 1 + 1i 4 + 0i 2 + 0i 5 + 0i 3 + 0i 6 + 0i
矩阵乘法
语法
C = A * B C = mtimes(A, B)说明
C = A * B 是 A 和 B 的矩阵乘积
示例
A = [1 2 3; 4 5 6]; B = [1 2 ;3 4; 5 6]; C = A * BC = 22 28 49 64
矩阵右除
语法
C = B / A C = mrdivide(B, A)说明
x = B/A 对线性方程组 x * A = B 求解 x。矩阵 A 和 B 必须具有相同的列数
示例
A = [3.2 2.7 3.4; 4.3 5.2 1.6]; B = [1.2 0.4 1.3; 0.9 0.5 0.7]; C = B / AC = 0.4740 -0.1338 0.2230 0.0037
矩阵转置
语法
C = A' C = ctranspose(A)说明
C = A' 返回 A 的复共轭转置
示例
A = [1+i 2 3; 4 5 6]; C = A'C = 1 - 1i 4 + 0i 2 + 0i 5 + 0i 3 + 0i 6 + 0i
# 关系运算
比较运算符
| 运算符 | 说明 |
|---|---|
| == | 相等 |
| >= | 大于或等于 |
| > | 大于 |
| <= | 小于等于 |
| < | 小于 |
| ~= | 不等于 |
| isequal | 确定数组相等性 |
| isequaln | 测试数组相等性,将 NaN 值视为相等 |
部分比较运算符示例如下:
==
语法
A == B eq(A, B)说明
A == B 返回一个逻辑数组,其中包含 A 和 B 中对应元素的相等性
示例
A = [1 2 3; 4 5 6]; B = [1 2 3; 7 8 9]; A == Bans = 2x3 logical true true true false false false
>=
语法
A >= B ge(A, B)说明
A >= B 返回一个逻辑数组,其中包含 A 和 B 中对应元素的大于或等于性
示例
A = [1 2 3; 4 5 6]; B = [1 2 3; 7 8 9]; A >= Bans = 2x3 logical true true true false false false
~=
语法
A ~= B ne(A, B)说明
A ~= B 返回一个逻辑数组,其中包含 A 和 B 中对应元素的不等于性
示例
A = [1 2 3; 4 5 6]; B = [1 2 3; 7 8 9]; A ~= Bans = 2x3 logical false false false true true true
isequal
语法
tf = isequal(A,B) tf = isequal(A1,A2,...,An)说明
如果
A和B等效,则tf = isequal(A,B)返回逻辑值true;否则,返回逻辑值false。要将
NaN、NaT、<undefined>和<missing>值视为与其他此类值相等,请使用isequaln。示例
A = struct('field1',0.005,'field2',2500); B = struct('field2',2500,'field1',0.005); tf = isequaln(A,B)ans =
1x1 logical
true
# 逻辑运算
逻辑运算符
| 运算符 | 解释 |
|---|---|
| & | 逻辑与 |
| | | 逻辑或 |
| ~ | 逻辑非 |
| && | 短路与 |
| || | 短路或 |
| xor | 计算逻辑异 OR |
| all | 确定所有的数组元素是为非零还是 true |
| any | 确定任何数组元素是否为非零 |
&
语法
A & B and(A, B)说明
A & B 返回一个逻辑数组。如果 A 和 B 在相同的数组位置都包含非零元素,则输出数组中对应位置的元素将设置为逻辑值 1 (true)。如果不是,则将数组元素设置为 0。
示例
A = [5 7 0; 0 2 9; 5 0 0]; B = [6 6 0; 1 3 5; -1 0 0]; A & Bans = 3x3 logical true true false false true true true false false
|
语法
A | B or(A, B)说明
A | B 返回一个逻辑数组。如果 A 或 B 在相同的数组位置包含非零元素,则输出数组中对应位置的元素将设置为逻辑值 1 (true)。如果不是,则将数组元素设置为 0。
示例
A = [5 7 0; 0 2 9; 5 0 0]; B = [6 6 0; 1 3 5; -1 0 0]; A | Bans = 3x3 logical true true false true true true true false false
~
语法
~A not(A)说明
~A 返回一个逻辑数组。如果 A 中元素为零值,则数组中对应元素为逻辑值 1 (true) 值;如果 A 中元素为非零值,则数组中对应元素为逻辑值 0 (false)。
示例
A = [1 0; 0 1]; ~Aans = 2x2 logical false true true false
&&
语法
expr1 && expr2说明
expr1 && expr2 表示使用短路行为的逻辑 AND 运算。即,如果 expr1 为逻辑值 0 (false),将不计算 expr2 的结果。每个表达式的计算结果都必须为标量逻辑值
示例
b = 0; a = 20; x = (b ~= 0) && (a/b > 18.5)x = 1x1 logical false
||
语法
expr1 || expr2说明
expr1 || expr2 表示使用短路行为的逻辑 OR 运算。即,如果 expr1 为逻辑值 1 (true),将不计算 expr2 的结果。每个表达式的计算结果都必须为标量逻辑值。
示例
X = [1 0 0 1 1]; Y = [0 0 0 0 0]; any(X) || all(Y)ans = 1x1 logical true
# 按位运算
位运算符
| 运算符 | 解释 |
|---|---|
| bitand | 按位与 |
| bitor | 按位或 |
| bitxor | 按位异或 |
| bitcmp | 按位补码 |
| bitget | 获取指定位置的位 |
| bitset | 设置指定位置的位 |
| bitshift | 将位移动指定位数 |
| swapbytes | 交换字节顺序 |
完整位运算函数列表详见库函数帮助,部分位运算函数示例如下:
bitand
语法
bitand(A, B)说明
C = bitand(A,B) 返回 A 和 B 的按位 AND。
示例
A = [1 2 3; 4 5 6; 7 8 9]; B = [1 0 1; 0 1 0; 1 0 1]; bitand(A, B)ans = 1 0 1 0 1 0 1 0 1
bitor
语法
bitor(A, B)说明
C = bitor(A,B) 返回 A 和 B 的按位 OR。
示例
A = [1 2 3; 4 5 6; 7 8 9]; B = [1 0 1; 0 1 0; 1 0 1]; bitor(A, B)ans = 1 2 3 4 5 6 7 8 9
bitxor
语法
bitxor(A, B)说明
C = bitxor(A,B) 返回 A 和 B 的按位 XOR。
示例
A = [1 2 3; 4 5 6; 7 8 9]; B = [1 0 1; 0 1 0; 1 0 1]; bitxor(A, B)ans = 0 2 2 4 4 6 6 8 8
# 循环及条件语句
# for 循环
语法
for index = values statements end说明
在循环中将一组语句执行特定次数。
示例
res = 0; for v = [1 5 8 17] res = res + v; end resans = 31
# while 循环
语法
while expression statements end说明
计算一个表达式,并在该表达式为 true 时在一个循环中重复执行一组语句。表达式的结果非空并且仅包含非零元素(逻辑值或实数值)时,该表达式为 true。否则,表达式为 false。
while 中的条件表达式,会将逻辑运算 | 和 & 视为短路运算 || 和 &&
示例
v = 0; while v < 10 v = v + 1; end vans = 10
# if 语句
语法
if expression statements elseif expression statements else statements end说明
计算表达式并在表达式为 true 时执行一组语句。表达式的结果非空并且仅包含非零元素(逻辑值或实数值)时,该表达式为 true。否则,表达式为 false.
if 中的条件表达式,会将逻辑运算 | 和 & 视为短路运算 || 和 &&
示例
if-end语句v = 0; if v < 10 v = v + 1; end vans = 1if-else-end语句v = 0; if v < 10 v = v + 1; else v = v - 1; end vans = 1if-elseif-else-end语句v = 0; if v < 10 v = v + 1; elseif v > 10 v = v - 1; else v = 0; end vans = 1
# switch 语句
语法
switch switch_expression case case_expression statements case case_expression statements ... otherwise statements end说明
计算表达式并选择执行多组语句中的一组。每个选项为一个 case。switch 块会测试每个 case,直至一个 case 表达式为 true。当 case 表达式为 true 时,执行对应的语句,然后退出 switch 块。otherwise 块是可选的。仅当没有 case 为 true 时,才会执行这些语句
示例
v = 0; switch v case 0 v = 3; case 1 v = 4; end vv = 3
# try-catch 语句
语法
try statements catch exception statements end说明
在 try 块中执行一组语句。如果在 try 块中发生错误,则执行 catch 块。
示例
try a = notaFunction(5,6); catch a = 0; end aa = 0
# break 语句
语法
break说明
用于终止执行 for 或 while 循环。不执行循环中在 break 语句之后显示的语句。在嵌套循环中,break 仅从它所发生的循环中退出。控制传递给该循环的 end 之后的语句。
示例
v = 0; while v < 10 v = v + 1; if v == 5 break; end end vv = 5
# continue 语句
语法
continue说明
continue 将控制权传递到 for 或 while 循环的下一迭代。它跳过当前迭代的循环体中剩余的任何语句。程序继续从下一迭代执行。continue 仅在调用它的循环的主体中起作用。在嵌套循环中,continue 仅跳过循环所发生的循环体内的剩余语句。
示例
v = 0; while v < 10 v = v + 1; if v == 5 continue; end end vv = 10
# pause
语法
pause pause(n) pause(state)说明
暂时停止执行 MLang
示例
暂停执行
% 暂停执行 5 秒。MLang 在暂停执行时会阻止或隐藏命令提示符。 n = 5; pause(n)禁用暂停设置
% 禁用暂停设置并查询当前状态。 pause('off') pause('query')ans = 'off'% 暂停执行 100 秒。由于暂停设置为 off(关闭),MLang 会忽略暂停执行的请求,并立即返回命令提示符。 pause(100)% 启用暂停设置。 pause('on')
# return 语句
语法
return说明
用于强制在到达调用脚本或函数的末尾前将控制权交还给调用程序
示例:
v = 0; while v < 10 v = v + 1; if v == 5 break; end return end vv = 1
# 函数
# 创建函数
匿名函数
f = @(x) x^2; f(5)ans = 25函数文件
在 MLang matlab 下定义如下函数:
function nested_func() x = 10; function [y]= fcn() x=15; y = x*2; end fcn() end
# 函数调用
- 调用函数句柄
f = @sin; f(0.5)ans = 0.4794 - 调用函数文件
以调用
创建函数章节中定义的nested_func函数为例:nested_func()ans = 30
# 作用域变量
global
语法
global var1 ... varN说明
global var1 ... varN 将变量 var1 ... varN 声明为作用域中的全局变量。
示例:
clear all function setGlobalx(val); global x x = val; end function r = getGlobalx global x r = x; end setGlobalx(1138) r = getGlobalxr = 1138
# 特殊语法
# 换行
在数组字面量中,换行无需 ... ,而一般的表达式如函数调用,换行需在行末补充...。
- 示例
% 数组字面量
A = [ 1 2
3 4 ]
A =
1 2
3 4
% 表达式换行时需要加...
B = 1 + 2 + ...
3
B =
6
# 运行时取属性
取运行时变量的属性。
s.x = 1;
attr = "x";
s.(attr)
ans =
1
# 函数文件
新建example.m文件,在脚本文件中可以定义多个没有end的 function。打开该脚本文件后运行:
% 以下为脚本内容
function x = func1()
x = func2();
function y = func2()
y = 6;
% 运行脚本文件结果为:
ans =
6