TSL的基础算符+,-,*,/,\,%,mod,div,^,~,.=,.>,.<,.<>,.>=,.<=,.!,.&,.|,.^,.||,.&&,.!!,like,++,--都支持矩阵(数组)的计算,可以支持简单类型和矩阵进行计算,也支持矩阵和矩阵一起进行计算。
用二元运算符支持矩阵对矩阵,矩阵对常量,常量对矩阵,加法为例:
array(1,2,3)+array(2,3,4)为array(3,5,7)
1+array(1,2)和array(1,2)+1为array(2,3)
和其他的支持矩阵计算的语言不同,TSL的基础的算符对矩阵计算依旧是原来基础算符的含义,例如矩阵和矩阵用*来计算,是每个相应单元格之间相乘。
基础算符的运算既支持二维数组(矩阵),也支持一维数组或者其他维度的数组。
默认情况下,也支持对非完全矩阵的计算,即当对应位置不存在时或为nil时,当0处理。
例如:Array(“A”:100,”B”:200,”C”:300)+array(“A”:1,”C”:3,”D”:4)
可以计算的结果为Array(“A”:101,”B”:200,”C”:303,”D”:4)。
若希望该种计算时进行报错或提示,可通过系统参数设置FAQ:
Q:CalcCTRLWord系统参数设置:控制nil参与计算以及浮点除0的警告或者出错
例子1:矩阵和简单类型的计算。
A:=array(1,2,3);
A:=A+1;//该写法也可以写成 A+=1;
// 结果A是array(2,3,4)也就是每个单元格都加1。
A:=Ones(10,10);//初始化一个全1的10*10矩阵。
A:=A*3;
// 结果A是一个10*10的全3矩阵。
例子2:矩阵和矩阵的计算
A:=array(1,2,3);
B:=array(2,3,4);
A:=A*B; //也可以写成A*=B;
//结果A是array(2,6,12)
A:=Eye(10,10);
B:=Ones(10,10);
A:=A+B;
//结果A是对角线为全2其他为全1的矩阵。
例子3:非完全矩阵的计算-矩阵与矩阵的大小不一致时的计算
A:=array("A":1,"B":1,"C":1);
B:=array("A":2,"C":2);
return A+B;
//结果A为:array("A":3,"B":1,"C":3)
目前,矩阵和矩阵以及矩阵和简单类型的计算支持所有常用的基础算符有+,-,*,/,\,mod,div,^,~等简单算符。
支持不同维度的矩阵计算,对应如:
| 运算符 | 运算 | 运算对象 | 结果类型
|
|---|
| + | 加 | 实数+数组
数组+数组
一维数组+二维数组 | 实数与数组每个单元格值相加
两个数组对应单元格的值相加
一维数组与二维数组每列对应单元格值相加
|
| - | 减 | 同加法 | 同加法
|
| * | 乘 | 同加法 | 同加法
|
| / | 右除 | 同加法 | 同加法
|
| \ | 左除 | 同加法 | 同加法
|
| %,mod | 取余 | 同加法 | 同加法
|
| div | 除取整 | 同加法 | 同加法
|
| ^ | 乘方 | 同加法 | 同加法
|
| ~ | 求对数 | 同加法 | 同加法
|
| .= | 等于 | 同加法 | 同加法
|
| .> | 大于 | 同加法 | 同加法
|
| .< | 小于 | 同加法 | 同加法
|
| .<> | 不等于 | 同加法 | 同加法
|
| .>= | 大于等于 | 同加法 | 同加法
|
| .<= | 小于等于 | 同加法 | 同加法
|
| .& | 位与 | 同加法 | 同加法
|
| .| | 位或 | 同加法 | 同加法
|
| .! | 位非 | .!数组 | 数组每个单元格值求位非
|
| .^ | 位异或 | 同加法 | 同加法
|
| shl | 位左移 | 同加法 | 同加法
|
| rol | 位循环左移 | 同加法 | 同加法
|
| shr | 位右移 | 同加法 | 同加法
|
| ror | 位循环右移 | 同加法 | 同加法
|
| .&& | 逻辑与 | 同加法 | 同加法
|
| .|| | 逻辑或 | 同加法 | 同加法
|
| .!! | 逻辑非 | .!!数组 | 数组每个单元格值求是否为真
|
| like | 模式匹配判断 | 同加法 | 同加法
|
| ++ | 加1 | 数组++/++数组 | 数组每个单元格值+1
|
| -- | 减1 | 数组--/--数组 | 数组每个单元格值-1
|
范例:
范例1
//实数与数组相加
num:=5;
arr:=array(1,2,3,4,5);
return num+arr;
//返回:array(6,7,8,9,10)
范例2
//数组与数组相加
arr1:=array(1,2,3,4,5);
arr2:=array(6,7,8,9,10);
return arr1+arr2;
//返回:array(7,9,11,13,15)
范例3
//一维数组与二维数组相加
arr1:=array(1,2,3,4,5);
arr2:=ones(5,array("a","b","c"));;
return arr1+arr2;
//结果:
范例4
//数组自增1
arr:=array(1,2,3,4,5);
return ++arr;
//返回:array(2,3,4,5,6)