Commit 2f0140eb by dongshufeng

更新RustScript手册

parent 29af4ad0
# RustScript 语言规范 # RustScript 语言规范
...@@ -42,6 +42,7 @@ PQ_bus ...@@ -42,6 +42,7 @@ PQ_bus
``` ```
### 2.4 数学常量约定 ### 2.4 数学常量约定
- π:pi - π:pi
- 自然常数:e
- 分母为零:NAN - 分母为零:NAN
- 正无穷大:INF - 正无穷大:INF
- 负无穷大:NEG_INF - 负无穷大:NEG_INF
...@@ -166,162 +167,960 @@ QD = 3; ...@@ -166,162 +167,960 @@ QD = 3;
### 5.1 张量索引 ### 5.1 张量索引
```rustscript ```rustscript
// 单个元素访问 函数
element = get(matrix, row, col); // 获取指定位置的单个元素 get
语法
// 注意:不支持 A[0,1] 这样的直接索引方式 element = get(t, row, col); // 获取指定位置的单个元素
// 错误写法:element = matrix[0, 1]; // 不支持 注意:不支持 A[0,1] 这样的直接索引方式
输入参数
// 负索引(从末尾开始) t - 张量,若为稀疏矩阵,仅能获取非零元
last_element = get(vector, -1); row - 行索引,标量
col - 列索引,标量
v - 向量
示例
输入 get([1, 2, 3], 1)
结果 2
输入 get([[1, 2, 3], [4, 5, 6], [7, 8, 9]], 1, 2)
结果 6
输入 get(sparse([0,0],[0,1],[1,2], 2, 2), 0, 1)
结果 2
``` ```
### 5.2 张量切片 ### 5.2 张量切片
```rustscript ```rustscript
// slice函数用于取矩阵的行列 函数
// slice(matrix, row_spec, col_spec) slice
// [0] 代表所有行或所有列 语法
slice(t, row_spec, col_spec)
// 重要:返回类型取决于参数格式 输入参数
t - 张量
// 1. 使用范围参数[start, end] - 返回二维张量 row_spec - 行索引,数值代表单个索引,[0]代表所有行,[start,end,step]代表范围和步长
col_2d = slice(a, [0], [1, 2]); // 取第2列所有行,返回3×1列向量(二维张量) col_spec - 列索引,数值代表单个索引,[0]代表所有列,[start,end,step]代表范围和步长
row_2d = slice(a, [1, 2], [0]); // 取第2行所有列,返回1×3行向量(二维张量) 返回类型
sub_matrix = slice(matrix, [0,3], [1,4]); // 行0-2,列1-3的子矩阵(二维张量) 1. 使用范围参数[start, end] - 返回二维张量
col_2d = slice(a, [0], [1, 2]); // 取第2列所有行,返回3×1列向量(二维张量)
// 2. 使用单个索引 - 返回一维张量 row_2d = slice(a, [1, 2], [0]); // 取第2行所有列,返回1×3行向量(二维张量)
col_1d = slice(a, [0], 1); // 取第2列所有行,返回shape为[3]的一维张量 sub_t = slice(t, [0,3], [1,4]); // 行0-2,列1-3的子矩阵(二维张量)
row_1d = slice(a, 1, [0]); // 取第2行所有列,返回shape为[3]的一维张量
2. 使用单个索引 - 返回一维张量
// 实际应用示例 col_1d = slice(a, [0], 1); // 取第2列所有行,返回shape为[3]的一维张量
// 假设a是3×3矩阵: row_1d = slice(a, 1, [0]); // 取第2行所有列,返回shape为[3]的一维张量
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; 示例
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
// 二维张量切片(保持矩阵结构) 输入 slice(a, [0], [1, 2])
col_vector = slice(a, [0], [1, 2]); // 返回[[2], [5], [8]] - 3×1列向量(二维张量) 结果 [[2], [5], [8]]
row_vector = slice(a, [1, 2], [0]); // 返回[[4, 5, 6]] - 1×3行向量(二维张量)
输入 slice(a, [1, 2], [0])
// 一维张量切片(扁平化) 结果 [[4, 5, 6]]
col_flat = slice(a, [0], 1); // 返回[2, 5, 8] - shape为[3]的一维张量
row_flat = slice(a, 1, [0]); // 返回[4, 5, 6] - shape为[3]的一维张量 输入 slice(a, [1, 3], [0, 2])
结果 [[4,5],[7,8]]
// 电力系统应用示例
voltage = slice(bus, [0], [VM-1, VM]); // 所有行,VM列(二维张量) 输入 slice(a, [0, 3, 2], [0, 3, 2])
angle = slice(bus, [0], VA-1); // 所有行,VA列(一维张量) 结果 [[1,3],[7,9]]
输入 slice(a, [0], 1)
结果 [2, 5, 8]
输入 slice(a, 1, [0])
结果 [4, 5, 6]
电力系统应用示例
voltage = slice(bus, [0], [VM-1, VM]); // 所有行,VM列(二维张量)
angle = slice(bus, [0], VA-1); // 所有行,VA列(一维张量)
``` ```
### 5.3 张量赋值操作 ### 5.3 获取张量指定行列
```rustscript ```rustscript
// assign函数用于对对应位置赋值,要求源张量和目标位置的形状匹配 函数
// assign(target, source, row_spec, col_spec) select
语法
// 重要:source的维度必须与目标位置的维度匹配 select(t, row_spec, col_spec)
输入参数
// 1. 赋值二维张量 - source必须是匹配的二维张量 t - 张量
b_2d = [[1.0], [2.0], [3.0]]; // 3×1列向量(二维张量) row_spec - 行索引,数值代表单个索引,[]代表所有行,向量代表指定多行
assign(a, b_2d, [0], [1, 2]); // 正确:b_2d是3×1列向量,匹配slice(a,[0],[1,2]) col_spec - 列索引,数值代表单个索引,[]代表所有列,向量代表指定多列
示例
c_2d = [[1.0, 2.0, 3.0]]; // 1×3行向量(二维张量) a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
assign(a, c_2d, [1, 2], [0]); // 正确:c_2d是1×3行向量,匹配slice(a,[1,2],[0]) 输入 select(a, [0,1], [2])
结果 [[3], [6]]
// 2. 赋值一维张量 - source必须是匹配的一维张量
b_1d = [1.0, 2.0, 3.0]; // shape为[3]的一维张量 输入 select(a, [0,2])
assign(a, b_1d, [0], 1); // 正确:b_1d是一维张量,匹配slice(a,[0],1) 结果 [[1, 2, 3], [7, 8, 9]]
assign(a, b_1d, 1, [0]); // 正确:b_1d是一维张量,匹配slice(a,1,[0])
输入 select(a, [], [0,2])
// 错误示例(形状不匹配) 结果 [[1,3], [4,6], [7,9]]
// assign(a, b_1d, [0], [1, 2]); // 错误:一维张量不能赋值给二维位置
// assign(a, b_2d, [0], 1); // 错误:二维张量不能赋值给一维位置 输入 select(a, 0, [0,2])
结果 [[1,3]]
// 实际应用示例 ```
voltage = slice(bus, [0], [VM-1, VM]); // 获取电压幅值列(二维张量)
new_voltage = [[1.05], [1.02], [1.01]]; // 新的电压值(二维张量)
assign(bus, new_voltage, [0], [VM-1, VM]); // 更新电压幅值
angle_flat = slice(bus, [0], VA-1); // 获取电压角度(一维张量) ### 5.4 张量赋值操作
new_angles = [0.0, -2.5, 1.2]; // 新的角度值(一维张量) ```rustscript
assign(bus, new_angles, [0], VA-1); // 更新电压角度 函数
assign
语法
assign(target, source, row_spec, col_spec)
输入参数
target - 待赋值张量
source - 赋值张量
row_spec - 行索引,数值代表单个索引,[0]代表所有行,[start,end,step]代表范围和步长
col_spec - 列索引,数值代表单个索引,[0]代表所有列,[start,end,step]代表范围和步长
重要:source的维度必须与target切片的形状匹配
输入参数示例
1. 赋值二维张量 - source必须是匹配的二维张量
b_2d = [[1.0], [2.0], [3.0]]; // 3×1列向量(二维张量)
assign(a, b_2d, [0], [1, 2]); // 正确:b_2d是3×1列向量,匹配slice(a,[0],[1,2])
c_2d = [[1.0, 2.0, 3.0]]; // 1×3行向量(二维张量)
assign(a, c_2d, [1, 2], [0]); // 正确:c_2d是1×3行向量,匹配slice(a,[1,2],[0])
2. 赋值一维张量 - source必须是匹配的一维张量
b_1d = [1.0, 2.0, 3.0]; // shape为[3]的一维张量
assign(a, b_1d, [0], 1); // 正确:b_1d是一维张量,匹配slice(a,[0],1)
assign(a, b_1d, 1, [0]); // 正确:b_1d是一维张量,匹配slice(a,1,[0])
错误示例(形状不匹配)
// assign(a, b_1d, [0], [1, 2]); // 错误:一维张量不能赋值给二维位置
// assign(a, b_2d, [0], 1); // 错误:二维张量不能赋值给一维位置
示例
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
输入 assign(a, [[-2],[-5],[-8]], [0], [1,2])
结果 [[1, -2, 3], [4, -5, 6], [7, -8, 9]]
输入 assign(a, [[-4,-5,-6]], [1,2], [0])
结果 [[1, 2, 3], [-4, -5, -6], [7, 8, 9]];
输入 assign(a, [[-4,-5],[-7,-8]], [1,3], [0,2])
结果 [[1, 2, 3], [-4, -5, 6], [-7, -8, 9]]
输入 assign(a, [[-1,-3],[-7,-9]], [0,3,2], [0,3,2])
结果 [[-1, 2, -3], [4, 5, 6], [-7, 8, -9]]
输入 assign(a, [-2,-5,-8], [0], 1)
结果 [[1,-2,3],[4,-5,6],[7,-8,9]]
输入 assign(a, [-4,-5,-6], 1, [0])
结果 [[1, 2, 3], [-4, -5, -6], [7, 8, 9]]
电力系统应用示例
voltage = slice(bus, [0], [VM-1, VM]); // 获取电压幅值列(二维张量)
new_voltage = [[1.05], [1.02], [1.01]]; // 新的电压值(二维张量)
assign(bus, new_voltage, [0], [VM-1, VM]); // 更新电压幅值
angle_flat = slice(bus, [0], VA-1); // 获取电压角度(一维张量)
new_angles = [0.0, -2.5, 1.2]; // 新的角度值(一维张量)
assign(bus, new_angles, [0], VA-1); // 更新电压角度
``` ```
### 5.4 张量形状和维度说明 ### 5.5 张量形状和维度
#### 5.5.1 重要概念区分
```rustscript ```rustscript
// 重要概念区分:
a = [1, 2, 3]; // 一维张量, shape: [3] a = [1, 2, 3]; // 一维张量, shape: [3]
b = [[1, 2, 3]]; // 行向量(二维张量), shape: [1, 3] b = [[1, 2, 3]]; // 行向量(二维张量), shape: [1, 3]
c = [[1], [2], [3]]; // 列向量(二维张量), shape: [3, 1] c = [[1], [2], [3]]; // 列向量(二维张量), shape: [3, 1]
// 在运算中: 在运算中:
// - 一维张量在运算时相当于行向量 - 一维张量在运算时相当于行向量
// - 行向量和列向量都属于二维张量,但形状不同 - 行向量和列向量都属于二维张量,但形状不同
// - slice和assign函数的行为取决于参数格式和返回的张量维度 - slice和assign函数的行为取决于参数格式和返回的张量维度
```
// 形状检查示例 #### 5.5.2 获取张量维数
ndims(a); // 返回 1 (一维张量) ```rustscript
ndims(b); // 返回 2 (二维张量) 函数
ndims(c); // 返回 2 (二维张量) ndim
语法
size(a, 0); // 返回 3 ndim(t)
size(b, 0); // 返回 1 (行数) 输入参数
size(b, 1); // 返回 3 (列数) t - 张量
size(c, 0); // 返回 3 (行数) 示例
size(c, 1); // 返回 1 (列数) 输入 ndim([1, 2, 3])
结果 1
输入 ndim([[1, 2, 3]])
结果 2
输入 ndim([[1], [2], [3]])
结果 2
```
#### 5.5.3 获取指定维度大小
```rustscript
函数
size
语法
size(t, dim)
输入参数
t - 张量
dim - 指定维度,若该参数为空则返回各维度大小构成的向量
示例
输入 size([[1., 0.5, 0.3, 0.2], [0.5, 1., 0.6, 0.5], [0.3, 0.6, 1., 0.7]])
结果 [3,4]
输入 size([1, 2, 3], 0)
结果 3
输入 size([[1, 2, 3]], 0)
结果 1
输入 size([[1, 2, 3]], 1)
结果 3
输入 size([[1], [2], [3]], 0)
结果 3
输入 size([[1], [2], [3]], 1)
结果 1
``` ```
## 6. 运算符 ## 6. 运算符
### 6.1 算术运算符 ### 6.1 算术运算符
#### 6.1.1 标量运算
##### 6.1.1.1 加法
```rustscript ```rustscript
// 标量运算 运算符
a + b; // 加法 +
a - b; // 减法 语法
a * b; // 乘法 a + b;
a / b; // 除法 ```
a ^ b; // 幂运算 ##### 6.1.1.2 减法
```rustscript
// 元素级运算(张量) 运算符
A .+ B; // 元素级加法 -
A .- B; // 元素级减法 语法
A .* B; // 元素级乘法 a - b;
A ./ B; // 元素级除法 ```
A .^ 2; // 元素级幂运算 ##### 6.1.1.3 乘法
```rustscript
// 矩阵运算 运算符
A * B; // 矩阵乘法 *
A'; // 转置 语法
inv(A); // 逆矩阵 a * b;
det(A); // 行列式 ```
##### 6.1.1.4 除法
```rustscript
运算符
/
语法
a / b;
```
##### 6.1.1.5 幂运算
```rustscript
运算符
^
语法
a ^ b;
```
#### 6.1.2 元素级运算(张量)
##### 6.1.2.1 元素级加法
```rustscript
运算符
+
语法
A + B;
输入参数
A - 矩阵
B - 矩阵
若A的形状与B的形状相同,对应元素相加
若A为行向量且长度与B的列数相同,则B的每一行均与A相加,反之亦然
若A为列向量且长度与B的行数相同,则B的每一列均与A相加,反之亦然
示例
输入 [10,20]+[[1,2],[3,4]]
结果 [[11,22],[13,24]]
输入 [[10],[20]]+[[1,2],[3,4]]
结果 [[11,12],[23,24]]
输入 [c(-3,-4),c(-1,-2)]+[[c(1,2),c(3,4)],[c(5,6),c(7,8)]]
结果 [[c(-2,-2),c(2,2)],[c(2,2),c(6,6)]]
输入 [2,3]+sparse([0,1,2],[1,0,1],[2,3,6], 3, 2)
结果 [[2,5],[5,3],[2,9]]
```
##### 6.1.2.2 元素级减法
```rustscript
运算符
-
语法
A - B;
输入参数
A - 矩阵
B - 矩阵
若A的形状与B的形状相同,对应元素相减
若A为行向量且长度与B的列数相同,则B的每一行均与A相减,反之亦然
若A为列向量且长度与B的行数相同,则B的每一列均与A相减,反之亦然
示例
输入 [10,20]-[[1,2],[3,4]]
结果 [[9,18],[7,16]]
输入 [[10],[20]]-[[1,2],[3,4]]
结果 [[9,8],[17,16]]
输入 [[c(1,2),c(3,4)],[c(5,6),c(7,8)]]-[c(-3,-4),c(-1,-2)]
结果 [[c(4,6),c(4,6)],[c(8,10),c(8,10)]]
输入 [2,3]-sparse([0,1,2],[1,0,1],[2,3,6], 3, 2)
结果 [[2,1],[-1,3],[2,3]]
```
##### 6.1.2.3 元素级乘法
```rustscript
运算符
.*
语法
A .* B;
输入参数
A - 矩阵
B - 矩阵
若A的形状与B的形状相同,对应元素相乘
若A为行向量且长度与B的列数相同,则B的每一行均与A相乘,反之亦然
若A为列向量且长度与B的行数相同,则B的每一列均与A相乘,反之亦然
示例
输入 [10,20].*[[1,2],[3,4]]
结果 [[10,40],[30,80]]
输入 [[100],[200]].*[[1,2],[3,4]]
结果 [[100,200],[600,800]]
输入 [c(1,2),c(3,4)].*[c(5,6),c(7,8)]
结果 [c(-7,16),c(-11,52)]
输入 [2,3].*sparse([0,1,2],[1,0,1],[2,3,6], 3, 2)
结果 [[0,6],[6,0],[0,18]]
```
##### 6.1.2.4 元素级除法
```rustscript
运算符
./
语法
A ./ B;
输入参数
A - 矩阵
B - 矩阵
若A的形状与B的形状相同,对应元素相除
若A为行向量且长度与B的列数相同,则B的每一行均与A相除,反之亦然
若A为列向量且长度与B的行数相同,则B的每一列均与A相除,反之亦然
示例
输入 [10,20]./[[1,2],[3,4]]
结果 [[10,10],[10/3, 5]]
输入 [[100],[200]]./[[1,2],[3,4]]
结果 [[100,50],[200/3,50]]
输入 [c(-7,16),c(-11,52)]./[c(5,6),c(7,8)]
结果 [c(1,2),c(3,4)]
输入 sparse([0,1,2],[1,0,1],[2,3,6], 3, 2)./[2,3]
结果 [[0,2/3],[1.5,0],[0,2]]
```
##### 6.1.2.5 元素级幂运算
```rustscript
运算符
.^
语法
A .^ n;
输入参数
A - 矩阵
n - 标量
示例
输入 [[1,2],[3,4]].^(-1)
结果 [[1,0.5], [1/3.,0.25]]
输入 [c(1,2),c(3,4)].^3
结果 [c(-3,4),c(-7,24)]
输入 sparse([0,1,2],[1,0,1],[2,3,6], 3, 2).^3
结果 [[3, 2, 0], [0, 1, 8], [1, 0, 27], [2, 1, 216]]
```
##### 6.1.2.6 元素级模运算
```rustscript
运算符
%
语法
A % B;
输入参数
A - 矩阵
B - 矩阵
若A的形状与B的形状相同,对应元素相模
若A为行向量且长度与B的列数相同,则B的每一行均与A相模,反之亦然
若A为列向量且长度与B的行数相同,则B的每一列均与A相模,反之亦然
示例
输入 [10,20]%[[2,3],[4,5]]
结果 [[0,2],[2,0]]
输入 [[11],[21]]%[[2,3],[4,5]]
结果 [[1, 2],[1, 1]]
输入 [7,9]%sparse([0,0,1,1],[0,1,0,1],[2,3,4,6], 2, 2)
结果 [[1,0],[3,3]]
```
#### 6.1.3 矩阵运算
##### 6.1.3.1 矩阵加法
```rustscript
运算符
+
语法
A + B;
输入参数
A - 矩阵
B - 矩阵
A与B的形状相同
示例
输入 [[1,2],[3,4]]+[[5,6],[7,8]]
结果 [[6,8],[10,12]]
输入 [[c(-3, -4), c(-1, -2)],[c(-7, -8), c(-5, -6)]]+
[[c(1, 2), c(3, 4)],[c(5, 6), c(7, 8)]]
结果 [[c(-2, -2), c(2, 2)],[c(-2, -2), c(2, 2)]]
输入 [[1,2],[3,4]]+sparse([0,1],[1,0],[2., 3.], 2, 2)
结果 [[1,4],[6,4]]
输入 sparse([0,1,2],[1,0,1],[2,3,6],3,2)+sparse([0,1,2],[0,0,0],[2,4,6],3,2)
结果 [[3, 2, 0], [0, 0, 2], [0, 1, 2], [1, 0, 7], [2, 0, 6], [2, 1, 6]]
```
##### 6.1.3.2 矩阵减法
```rustscript
运算符
-
语法
A - B;
输入参数
A - 矩阵
B - 矩阵
A与B的形状相同
示例
输入 [[1,2],[3,4]]-[[7,8],[5,6]]
结果 [[-6,-6],[-2,-2]]
输入 [[c(-3, -4), c(-1, -2)],[c(-7, -8), c(-5, -6)]]-
[[c(1, 2), c(3, 4)],[c(5, 6), c(7, 8)]]
结果 [[c(-4, -6), c(-4, -6)],[c(-12, -14), c(-12, -14)]]
输入 [[1,2],[3,4]]-sparse([0,1],[1,0],[2,3], 2, 2)
结果 [[1,0],[0,4]]
输入 sparse([0,1,2],[1,0,1],[2,3,6],3,2)-sparse([0,1,2],[0,0,0],[2,4,6],3,2)
结果 [[3, 2, 0], [0, 0, -2], [0, 1, 2], [1, 0, -1], [2, 0, -6], [2, 1, 6]]
```
##### 6.1.3.3 矩阵标量乘法
```rustscript
运算符
*
语法
n * A;
A * n;
输入参数
n - 标量
A - 矩阵
示例
输入 2*[[3],[2]]
结果 [[6],[4]]
输入 c(1,2)*[c(1,2),c(3,4)]
结果 [c(-3,4),c(-5,10)]
输入 2*sparse([1,2],[1,2],[2,3], 3, 3)
结果 [[3,3,0],[1,1,4],[2,2,6]]
```
##### 6.1.3.4 矩阵标量除法
```rustscript
运算符
/
语法
A / n;
输入参数
A - 矩阵
n - 标量
示例
输入 [[3],[2]]/2
结果 [[1.5],[1]]
输入 [c(1,2),c(3,4)]/c(1,2)
结果 [c(1,0),c(0.44,0.08)]
输入 sparse([1,2],[1,2],[2,3], 3, 3)/2
结果 [[3,3,0],[1,1,1],[2,2,1.5]]
```
##### 6.1.3.5 矩阵乘法
```rustscript
运算符
*
语法
A * B;
输入参数
A - 矩阵
B - 矩阵
A的列数需与B的行数相同
示例
输入 [[1,2,3],[4,5,6]]*[[1,2],[3,4],[5,6]]
结果 [[22,28], [49,64]]
输入 [[c(1, 2), c(3, 4), c(5, 6)],[c(7, 8), c(9, 10), c(11, 12)]]*
[[c(1, 2), c(3, 4)],[c(5, 6), c(7, 8)],[c(9, 10), c(11, 12)]]
结果 [[c(-27, 146), c(-33, 188)],[c(-45, 344), c(-51, 458)]]
输入 [[1,2,3],[4,5,6]]*sparse([0,1,2],[1,0,1],[2.0, 3.0, 6.0], 3, 2)
结果 [[6, 20], [15, 44]]
输入 sparse([0,1,2],[1,0,1],[2.0, 3.0, 6.0], 3, 2)*sparse([0,1,1],[1,0,2],[2.0, 4.0, 6.0], 2, 3)
结果 [[3, 3, 0], [0, 0, 8], [0, 2, 12], [1, 1, 6], [2, 0, 24], [2, 2, 36]]
```
##### 6.1.3.6 矩阵右除
```rustscript
运算符
/
语法
A / B;
输入参数
A - 矩阵
B - 方阵
A的列数需与B的行数相同
示例
输入 [[19,22],[43,50]]/[[1,2],[3,4]]
结果 [[-5,8],[-11,18]]
输入 [[c(-548, 232), c(-812, 384)],[c(-1236, 664), c(-1820, 1072)]]/
[[c(1, 2), c(3, 4)],[c(5, 6), c(7, 8)]]
结果 [[c(-12, 42), c(-16, 62)],[c(-20, 98), c(-24, 150)]]
输入 [[19,22],[43,50]]/sparse([0,0,1,1],[0,1,0,1],[1, 2, 3, 4], 2, 2)
结果 [[-5,8],[-11,18]]
输入 sparse([0,0,1,1],[0,1,0,1],[19,22,43,50], 2, 2)/sparse([0,0,1,1],[0,1,0,1],[1,2,3,4], 2, 2)
结果 [[2, 2, 0], [0, 0, -5], [0, 1, 8], [1, 0, -11], [1, 1, 18]]
```
##### 6.1.3.7 矩阵左除
```rustscript
运算符
\
语法
A \ B;
输入参数
A - 方阵
B - 矩阵
A的列数需与B的行数相同
示例
输入 [[2,1],[1,-3]]\[[5],[-1]]
结果 [[2],[1]]
输入 [[c(-12, 42), c(-16, 62)],[c(-20, 98), c(-24, 150)]]\
[[c(-548, 232), c(-812, 384)],[c(-1236, 664), c(-1820, 1072)]]
结果 [[c(1, 2), c(3, 4)],[c(5, 6), c(7, 8)]]
输入 sparse([0,0,1,1],[0,1,0,1],[2,1,1,-3], 2, 2)\[[5],[-1]]
结果 [[2],[1]]
输入 sparse([0,0,1,1],[0,1,0,1],[2,1,1,-3], 2, 2)\sparse([0,1],[0,0],[5,-1], 2, 1)
结果 [[2, 1, 0], [0, 0, 2], [1, 0, 1]]
```
##### 6.1.3.8 矩阵幂
```rustscript
运算符
^
语法
A ^ n;
输入参数
A - 方阵
n - 标量
示例
输入 [[1,2],[3,4]]^0
结果 [[1,0], [0,1]]
输入 [[c(1, 2), c(3, 4)],[c(5, 6), c(7, 8)]]^3
结果 [[c(-548, 232), c(-812, 384)],[c(-1236, 664), c(-1820, 1072)]]
输入 [[1,2],[3,4]]^(-1)
结果 [[-2, 1], [1.5, -0.5]]
输入 sparse([0,1,2],[1,0,1],[2, 3, 6], 3, 3)^3
结果 [[3, 3, 0], [0, 1, 12], [1, 0, 18], [2, 1, 36]]
```
##### 6.1.3.9 转置
```rustscript
运算符
'
语法
A';
输入参数
A - 矩阵
示例
输入 [1, 2, 3]'
结果 [[1], [2], [3]]
输入 [[c(1, 1), c(2, 2)], [c(3, 3), c(4, 4)]]'
结果 [[c(1, 1), c(3, 3)], [c(2, 2), c(4, 4)]]
输入 sparse([0,1,2], [1,0,1], [2, 3, 6], 3, 2)'
结果 [[2, 3, 0], [1, 0, 2], [0, 1, 3], [1, 2, 6]]
```
##### 6.1.3.10 逆矩阵
```rustscript
运算符
^(-1)
语法
A ^ (-1);
输入参数
A - 方阵
示例
输入 [[1,2],[3,4]]^(-1)
结果 [[-2, 1], [1.5, -0.5]]
```
##### 6.1.3.11 行列式
```rustscript
函数
det
语法
det(A);
输入参数
A - 方阵
示例
输入 det([[1,2],[3,4]])
结果 -2
输入 det([[c(1,2),c(3,4)],[c(5,6),c(7,8)]])
结果 c(0,-16)
``` ```
### 6.2 比较运算符 ### 6.2 比较运算符
#### 6.2.1 等于
```rustscript ```rustscript
// 标量比较 运算符
a == b; // 等于 ==
a != b; // 不等于 语法
a < b; // 小于 A == B;
a <= b; // 小于等于 输入参数
a > b; // 大于 A - 张量或标量
a >= b; // 大于等于 B - 张量或标量
若A、B均为张量,A、B形状应相同
// 元素级比较(张量) 对于复数,取实部进行比较
A .== B; // 元素级等于 返回参数
A .< B; // 元素级小于 若A为标量、B为张量,则返回与B形状相同的张量,其中元素为A与B对应元素的比较结果
若A为张量、B为标量,则返回与A形状相同的张量,其中元素为A对应元素与B的比较结果
若A、B均为张量,则返回与二者形状相同的张量,其中元素为A对应元素与B对应元素的比较结果
示例
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]==5
结果 [[0,0,0],[0,1,0],[0,0,0]]
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]==[[2, 2, 2], [4, 4, 4], [9, 9, 9]]
结果 [[0,1,0],[1,0,0],[0,0,1]]
输入 [[c(1,9), c(2,8), c(3,7)],[c(4,6), c(5,5), c(6,4)],[c(7,3), c(8,2), c(9,1)]]==c(4,5)
结果 [[c(0,0), c(0,0), c(0,0)],[c(1,0), c(0,0), c(0,0)],[c(0,0), c(0,0), c(0,0)]]
```
#### 6.2.2 不等于
```rustscript
运算符
!=
语法
A != B;
输入参数
A - 张量或标量
B - 张量或标量
若A、B均为张量,A、B形状应相同
对于复数,取实部进行比较
返回参数
若A为标量、B为张量,则返回与B形状相同的张量,其中元素为A与B对应元素的比较结果
若A为张量、B为标量,则返回与A形状相同的张量,其中元素为A对应元素与B的比较结果
若A、B均为张量,则返回与二者形状相同的张量,其中元素为A对应元素与B对应元素的比较结果
示例
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]!=5
结果 [[1,1,1],[1,0,1],[1,1,1]]
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]!=[[2, 2, 2], [4, 4, 4], [9, 9, 9]]
结果 [[1,0,1],[0,1,1],[1,1,0]]
输入 [[c(1,9), c(2,8), c(3,7)],[c(4,6), c(5,5), c(6,4)],[c(7,3), c(8,2), c(9,1)]]!=c(4,5)
结果 [[c(1,0), c(1,0), c(1,0)],[c(0,0), c(1,0), c(1,0)],[c(1,0), c(1,0), c(1,0)]]
```
#### 6.2.3 小于
```rustscript
运算符
<
语法
A < B;
输入参数
A - 张量或标量
B - 张量或标量
若A、B均为张量,A、B形状应相同
对于复数,取实部进行比较
返回参数
若A为标量、B为张量,则返回与B形状相同的张量,其中元素为A与B对应元素的比较结果
若A为张量、B为标量,则返回与A形状相同的张量,其中元素为A对应元素与B的比较结果
若A、B均为张量,则返回与二者形状相同的张量,其中元素为A对应元素与B对应元素的比较结果
示例
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]<5
结果 [[1,1,1],[1,0,0],[0,0,0]]
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]<[[2, 2, 2], [4, 4, 4], [9, 9, 9]]
结果 [[1,0,0],[0,0,0],[1,1,0]]
输入 [[c(1,9), c(2,8), c(3,7)],[c(4,6), c(5,5), c(6,4)],[c(7,3), c(8,2), c(9,1)]]<c(4,5)
结果 [[c(1,0), c(1,0), c(1,0)],[c(0,0), c(0,0), c(0,0)],[c(0,0), c(0,0), c(0,0)]]
```
#### 6.2.4 小于等于
```rustscript
运算符
<=
语法
A <= B;
输入参数
A - 张量或标量
B - 张量或标量
若A、B均为张量,A、B形状应相同
对于复数,取实部进行比较
返回参数
若A为标量、B为张量,则返回与B形状相同的张量,其中元素为A与B对应元素的比较结果
若A为张量、B为标量,则返回与A形状相同的张量,其中元素为A对应元素与B的比较结果
若A、B均为张量,则返回与二者形状相同的张量,其中元素为A对应元素与B对应元素的比较结果
示例
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]<=5
结果 [[1,1,1],[1,1,0],[0,0,0]]
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]<=[[2, 2, 2], [4, 4, 4], [9, 9, 9]]
结果 [[1,1,0],[1,0,0],[1,1,1]]
输入 [[c(1,9), c(2,8), c(3,7)],[c(4,6), c(5,5), c(6,4)],[c(7,3), c(8,2), c(9,1)]]<=c(4,5)
结果 [[c(1,0), c(1,0), c(1,0)],[c(1,0), c(0,0), c(0,0)],[c(0,0), c(0,0), c(0,0)]]
```
#### 6.2.5 大于
```rustscript
运算符
>
语法
A > B;
输入参数
A - 张量或标量
B - 张量或标量
若A、B均为张量,A、B形状应相同
对于复数,取实部进行比较
返回参数
若A为标量、B为张量,则返回与B形状相同的张量,其中元素为A与B对应元素的比较结果
若A为张量、B为标量,则返回与A形状相同的张量,其中元素为A对应元素与B的比较结果
若A、B均为张量,则返回与二者形状相同的张量,其中元素为A对应元素与B对应元素的比较结果
示例
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]>5
结果 [[0,0,0],[0,0,1],[1,1,1]]
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]>[[2, 2, 2], [4, 4, 4], [9, 9, 9]]
结果 [[0,0,1],[0,1,1],[0,0,0]]
输入 [[c(1,9), c(2,8), c(3,7)],[c(4,6), c(5,5), c(6,4)],[c(7,3), c(8,2), c(9,1)]]>c(4,5)
结果 [[c(0,0), c(0,0), c(0,0)],[c(0,0), c(1,0), c(1,0)],[c(1,0), c(1,0), c(1,0)]]
```
#### 6.2.6 大于等于
```rustscript
运算符
>=
语法
A >= B;
输入参数
A - 张量或标量
B - 张量或标量
若A、B均为张量,A、B形状应相同
对于复数,取实部进行比较
返回参数
若A为标量、B为张量,则返回与B形状相同的张量,其中元素为A与B对应元素的比较结果
若A为张量、B为标量,则返回与A形状相同的张量,其中元素为A对应元素与B的比较结果
若A、B均为张量,则返回与二者形状相同的张量,其中元素为A对应元素与B对应元素的比较结果
示例
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]>=5
结果 [[0,0,0],[0,1,1],[1,1,1]]
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]>=[[2, 2, 2], [4, 4, 4], [9, 9, 9]]
结果 [[0,1,1],[1,1,1],[0,0,1]]
输入 [[c(1,9), c(2,8), c(3,7)],[c(4,6), c(5,5), c(6,4)],[c(7,3), c(8,2), c(9,1)]]>=c(4,5)
结果 [[c(0,0), c(0,0), c(0,0)],[c(1,0), c(1,0), c(1,0)],[c(1,0), c(1,0), c(1,0)]]
``` ```
### 6.3 逻辑运算符 ### 6.3 逻辑运算符
#### 6.3.1 逻辑与
```rustscript ```rustscript
// 标量逻辑 运算符
a && b; // 逻辑与 &&
a || b; // 逻辑或 语法
~~a; // 逻辑非(注意:是两个波浪号) A && B;
输入参数
// 元素级逻辑(张量) A - 张量或标量
A .&& B; // 元素级逻辑与 B - 张量或标量
A .|| B; // 元素级逻辑或 若A、B均为张量,A、B形状应相同
.~~A; // 元素级逻辑非(两个波浪号) 对于复数,取实部进行逻辑运算
返回参数
若A为标量、B为张量,则返回与B形状相同的张量,其中元素为A与B对应元素的逻辑运算结果
若A为张量、B为标量,则返回与A形状相同的张量,其中元素为A对应元素与B的逻辑运算结果
若A、B均为张量,则返回与二者形状相同的张量,其中元素为A对应元素与B对应元素的逻辑运算结果
示例
输入 [[1, 0, 3], [0, 5, 6], [7, 0, 9]]&&5
结果 [[1,0,1],[0,1,1],[1,0,1]]
输入 [[1, 0, 3], [0, 5, 6], [7, 0, 9]]&&[[2, 0, 0], [0, 4, 0], [0, 0, 9]]
结果 [[1,0,0],[0,1,0],[0,0,1]]
输入 [[c(1,9), c(0,8), c(0,7)],[c(0,6), c(5,5), c(0,4)],[c(0,3), c(0,2), c(9,1)]]&&c(4,5)
结果 [[c(1,0), c(0,0), c(0,0)],[c(0,0), c(1,0), c(0,0)],[c(0,0), c(0,0), c(1,0)]]
```
#### 6.3.2 逻辑或
```rustscript
运算符
||
语法
A || B;
输入参数
A - 张量或标量
B - 张量或标量
若A、B均为张量,A、B形状应相同
对于复数,取实部进行逻辑运算
返回参数
若A为标量、B为张量,则返回与B形状相同的张量,其中元素为A与B对应元素的逻辑运算结果
若A为张量、B为标量,则返回与A形状相同的张量,其中元素为A对应元素与B的逻辑运算结果
若A、B均为张量,则返回与二者形状相同的张量,其中元素为A对应元素与B对应元素的逻辑运算结果
示例
输入 [[1, 0, 3], [0, 5, 6], [7, 0, 9]]||5
结果 [[1,1,1],[1,1,1],[1,1,1]]
输入 [[1, 0, 3], [0, 5, 6], [7, 0, 9]]||[[2, 0, 0], [0, 4, 0], [0, 0, 9]]
结果 [[1,0,1],[0,1,1],[1,0,1]]
输入 [[c(1,9), c(0,8), c(0,7)],[c(0,6), c(5,5), c(0,4)],[c(0,3), c(0,2), c(9,1)]]||c(4,5)
结果 [[c(1,0), c(1,0), c(1,0)],[c(1,0), c(1,0), c(1,0)],[c(1,0), c(1,0), c(1,0)]]
```
#### 6.3.3 逻辑非
```rustscript
运算符
~~
语法
~~A;
输入参数
A - 张量或标量,对于复数,取实部进行逻辑运算
示例
输入 ~~[[1, 0, 3], [0, 5, 6], [7, 0, 9]]
结果 [[0,1,0],[1,0,0],[0,1,0]]
输入 ~~[[c(1,9), c(0,8), c(0,7)],[c(0,6), c(5,5), c(0,4)],[c(0,3), c(0,2), c(9,1)]]
结果 [[c(0,0), c(1,0), c(1,0)],[c(1,0), c(0,0), c(1,0)],[c(1,0), c(1,0), c(0,0)]]
电力系统实际使用示例
bus_gen_status = ~~bus_gen_status; // 逻辑非运算
pq = find(bus_type == PQ || ~~bus_gen_status); // 组合逻辑运算
```
// 实际使用示例 ### 6.4 位运算符
bus_gen_status = ~~bus_gen_status; // 逻辑非运算 #### 6.4.1 位与
pq = find(bus_type == PQ || ~~bus_gen_status); // 组合逻辑运算 ```rustscript
运算符
&
语法
a & b;
输入参数
a - 标量
b - 标量
对于复数,取实部进行位运算
示例
输入 5&3
结果 1
输入 c(6, 8)&c(4, 5)
结果 c(4,0)
```
#### 6.4.2 位或
```rustscript
运算符
|
语法
a | b;
输入参数
a - 标量
b - 标量
对于复数,取实部进行位运算
示例
输入 5|3
结果 7
输入 c(6, 8)|c(4, 5)
结果 c(6,0)
```
#### 6.4.3 位异或
```rustscript
运算符
^^
语法
a ^^ b;
输入参数
a - 标量
b - 标量
对于复数,取实部进行位运算
示例
输入 5^^3
结果 6
输入 c(6, 8)^^c(4, 5)
结果 c(2,0)
```
#### 6.4.4 位取反
```rustscript
运算符
~
语法
~a;
输入参数
a - 标量,对于复数,取实部进行位运算
示例
输入 ~5
结果 -6
输入 ~c(6, 8)
结果 c(-7,0)
```
#### 6.4.5 位左移
```rustscript
运算符
<<
语法
a << b;
输入参数
a - 标量
b - 标量
对于复数,取实部进行位运算
示例
输入 5<<1
结果 10
输入 c(6, 8)<<c(2, 5)
结果 c(24,0)
```
#### 6.4.6 位右移
```rustscript
运算符
>>
语法
a >> b;
输入参数
a - 标量
b - 标量
对于复数,取实部进行位运算
示例
输入 5>>1
结果 2
输入 c(6, 8)>>c(2, 5)
结果 c(1,0)
```
#### 6.4.7 位取值
```rustscript
运算符
@
语法
a @ b;
输入参数
a - 标量
b - 标量
对于复数,取实部进行位运算
示例
输入 5@1
结果 1
输入 c(5, 8)@c(2, 5)
结果 c(0,0)
``` ```
## 7. 基本编程语句 ## 7. 基本编程语句
...@@ -393,72 +1192,1273 @@ fn make_y_bus(baseMVA, bus, branch) { ...@@ -393,72 +1192,1273 @@ fn make_y_bus(baseMVA, bus, branch) {
## 9. 内置函数 ## 9. 内置函数
### 9.1 数学函数 ### 9.1 数学函数
### 9.1.1 根号函数
```rustscript ```rustscript
// 基本数学函数 函数
sqrt(x), exp(x), log(x), log10(x) sqrt
sin(x), cos(x), tan(x) 语法
asin(x), acos(x), atan(x), atan2(y, x) sqrt(x);
abs(x), sign(x), floor(x), ceil(x), round(x) 输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算
// 复数函数 示例
real(z), imag(z), conj(z), abs(z), arg(z) 输入 sqrt([[1,4],[9,16])
结果 [[1,2], [3,4]]
输入 [c(-3,4), c(-7,24)]
结果 [c(1,2), c(3,4)]
输入 sqrt(sparse([0,1,2],[1,0,1],[4.,9.,36.], 3, 2))
结果 [[3, 2, 0], [0, 1, 2], [1, 0, 3], [2, 1, 6]]
```
### 9.1.2 自然指数函数
```rustscript
函数
exp
语法
exp(x);
输入参数
x - 矩阵或标量,若为稠密矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 exp([[1,2],[3,4]])
结果 [[e,e^2],[e^3,e^4]]
输入 exp([c(1., pi/2), c(2, pi)])
结果 [c(0, e), c(-e^2, 0)]
输入 exp(sparse([0,0],[0,1],[1,2], 2, 2))
结果 [[2, 2, 0], [0, 0, e], [0, 1, e^2]]
```
### 9.1.3 自然对数函数
```rustscript
函数
ln
语法
ln(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 ln([[1,e],[e^2,e^3]])
结果 [[0,1],[2,3]]
输入 ln([c(0,e), c(-e^2,0)])
结果 [c(1, pi/2), c(2, pi)]
输入 ln(sparse([0,0],[0,1],[1,e], 2, 2))
结果 [[2, 2, 0], [0, 0, 0], [0, 1, 1]]
```
### 9.1.4 常用对数函数
```rustscript
函数
log10
语法
log10(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 log10([[1,10],[100,1000]])
结果 [[0.,1.],[2.,3.]]
输入 log10([c(0, 10), c(-100, 0)])
结果 [c(1, 0.0.682188), c(2, 1.364376)]
输入 log10(sparse([0,0],[0,1],[1,10], 2, 2))
结果 [[2, 2, 0], [0, 0, 0], [0, 1, 1]]
```
### 9.1.5 正弦函数
```rustscript
函数
sin
语法
sin(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 sin([[0,pi/6],[pi/2,pi]])
结果 [[0,0.5],[1,0]]
输入 sin([c(1, 1), c(0, 1)])
结果 [c(1.298458, 0.634964), c(0, 1.175201)]
输入 sin(sparse([0,0],[0,1],[pi/6,pi/2], 2, 2))
结果 [[2, 2, 0], [0, 0, 0.5], [0, 1, 1]]
```
### 9.1.6 余弦函数
```rustscript
函数
cos
语法
cos(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 cos([[0,pi/3],[pi/2,pi]])
结果 [[1,0.5],[0,-1]]
输入 cos([c(1, 1), c(0, 1)])
结果 [c(0.833730, -0.988898), c(1.543081, 0)]
输入 cos(sparse([0,0],[0,1],[pi/3,pi/2], 2, 2))
结果 [[2, 2, 0], [0, 0, 0.5], [0, 1, 0]]
```
### 9.1.7 正切函数
```rustscript
函数
tan
语法
tan(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 tan([[0,pi/4],[0.75*pi,pi]])
结果 [[0,1],[-1,0]]
输入 tan([c(1, 1), c(0, 1)])
结果 [c(0.271753, 1.083923), c(0, 0.761594)]
输入 tan(sparse([0,0],[0,1],[pi/4,0.75*pi], 2, 2))
结果 [[2, 2, 0], [0, 0, 1], [0, 1, -1]]
```
### 9.1.8 反正弦函数
```rustscript
函数
asin
语法
asin(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 asin([[0,0.5],[1,-0.5]])
结果 [[0,pi/6],[pi/2,-pi/6]]
输入 asin([c(2, 0), c(0, 1)])
结果 [c(pi/2, -ln(2+sqrt(3))), c(0, -ln(sqrt(2)-1))]
输入 asin(sparse([0,0],[0,1],[0.5,1], 2, 2))
结果 [[2, 2, 0], [0, 0, pi/6], [0, 1, pi/2]]
```
### 9.1.9 反余弦函数
```rustscript
函数
acos
语法
acos(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 acos([[1,0.5],[0,-1]])
结果 [[0,pi/3],[pi/2,pi]]
输入 acos([c(2, 0), c(0, 1)])
结果 [c(0, -ln(2+sqrt(3))), c(0, -ln(sqrt(2)+1))]
输入 acos(sparse([0,0],[0,1],[0.5,0], 2, 2))
结果 [[2, 2, 0], [0, 0, pi/3], [0, 1, pi/2]]
```
### 9.1.10 反正切函数
```rustscript
函数
atan
语法
atan(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 atan([[0,1],[-1,sqrt(3)]])
结果 [[0,pi/4],[-pi/4,pi/3]]
输入 atan([c(1, 0), c(1, 1)])
结果 [c(pi/4, 0), c(1.017222, 0.402359)]
输入 atan(sparse([0,0],[0,1],[1,-1], 2, 2))
结果 [[2, 2, 0], [0, 0, pi/4], [0, 1, -pi/4]]
```
### 9.1.11 双曲正弦函数
```rustscript
函数
sinh
语法
sinh(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 sinh([[0,1],[-2,ln(3+sqrt(10))]])
结果 [[0,1.175201],[-3.626860,3]]
输入 sinh([c(1, 1), c(0, pi)])
结果 [c(0.634964, 1.298458), c(0, 0)]
输入 sinh(sparse([0,0],[0,1],[1,-2], 2, 2))
结果 [[2, 2, 0], [0, 0, 1.175201], [0, 1, -3.626860]]
```
### 9.1.12 双曲余弦函数
```rustscript
函数
cosh
语法
cosh(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 cosh([[0,1],[-0.5,ln(2+sqrt(3))]])
结果 [[1.,1.543081],[1.127626,2]]
输入 cosh([c(1, 1), c(0, 1)])
结果 [c(0.833730, 0.988898), c(0.540302, 0)]
输入 cosh(sparse([0,0],[0,1],[1,-0.5], 2, 2))
结果 [[2, 2, 0], [0, 0, 1.543081], [0, 1, 1.127626]]
```
### 9.1.13 双曲正切函数
```rustscript
函数
tanh
语法
tanh(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 tanh([[0,1],[-2,ln(3)]])
结果 [[0,0.761594],[-0.964028,0.8]]
输入 tanh([c(1, 1), c(0, 1)])
结果 [c(1.083923, 0.271753), c(0, 1.557408)]
输入 tanh(sparse([0,0],[0,1],[1,ln(3)], 2, 2))
结果 [[2, 2, 0], [0, 0, 0.761594], [0, 1, 0.8]]
```
### 9.1.14 双曲反正弦函数
```rustscript
函数
asinh
语法
asinh(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 asinh([[0,1],[-2,3]])
结果 [[0, 0.881374],[-1.443635, ln(3+sqrt(10))]]
输入 asinh([c(1, 1), c(0, 1)])
结果 [c(1.061275, 0.666239), c(0, pi/2)]
输入 asinh(sparse([0,0],[0,1],[1,-2], 2, 2))
结果 [[2, 2, 0], [0, 0, 0.881374], [0, 1, -1.443635]]
```
### 9.1.15 双曲反余弦函数
```rustscript
函数
acosh
语法
acosh(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 acosh([[1,2],[cosh(3),5]])
结果 [[0,1.316958],[3,ln(5+2*sqrt(6))]]
输入 acosh([c(0, 0), c(0, 1)])
结果 [c(0, pi/2), c(0.881374, pi/2)]
输入 acosh(sparse([0,0],[0,1],[2,cosh(3)], 2, 2))
结果 [[2, 2, 0], [0, 0, 1.316958], [0, 1, 3]]
```
### 9.1.16 双曲反正切函数
```rustscript
函数
atanh
语法
atanh(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 atanh([[0,0.5],[-2/3,3/4]])
结果 [[0, 0.549306],[-0.804719,0.5*ln(7)]]
输入 atanh([c(2, 0), c(0, 1)])
结果 [c(0.5*ln(3), -pi/2), c(0, pi/4)]
输入 atanh(sparse([0,0],[0,1],[0.5,-2/3], 2, 2))
结果 [[2, 2, 0], [0, 0, 0.549306], [0, 1, -0.804719]]
```
### 9.1.17 绝对值函数
```rustscript
函数
abs
语法
abs(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 abs([[0,-1],[-2,3]])
结果 [[0,1],[2,3]]
输入 abs(sparse([0,0],[0,1],[-1,-2], 2, 2))
结果 [[2, 2, 0], [0, 0, 1], [0, 1, 2]]
```
### 9.1.18 符号函数
```rustscript
函数
signum
语法
signum(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 signum([[0,-1],[-2,3]])
结果 [[1,-1],[-1,1]]
输入 signum([c(0,-1), c(-2,3)])
结果 [c(1, 0), c(-1, 0)]
输入 signum(sparse([0,0],[0,1],[-2,3], 2, 2))
结果 [[2, 2, 0], [0, 0, -1], [0, 1, 1]]
```
### 9.1.19 向下取整函数
```rustscript
函数
floor
语法
floor(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 floor([[0.6,-2.3],[1.3,-3.6]])
结果 [[0,-3],[1,-4]]
输入 floor([c(0.6,-2.3), c(1.3,-3.6)])
结果 [c(0, 0), c(1, 0)]
输入 floor(sparse([0,0],[0,1],[0.6,-2.3], 2, 2))
结果 [[2, 2, 0], [0, 0, 0], [0, 1, -3]]
```
### 9.1.20 向上取整函数
```rustscript
函数
ceil
语法
ceil(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 ceil([[0.6,-2.3],[1.3,-3.6]])
结果 [[1,-2],[2,-3]]
输入 ceil([c(0.6,-2.3), c(1.3,-3.6)])
结果 [c(1, 0), c(2, 0)]
输入 ceil(sparse([0,0],[0,1],[0.6,-2.3], 2, 2))
结果 [[2, 2, 0], [0, 0, 1], [0, 1, -2]]
```
### 9.1.21 四舍五入函数
```rustscript
函数
round
语法
round(x);
输入参数
x - 矩阵或标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 round([[0.6,-2.3],[1.3,-3.6]])
结果 [[1,-2],[1,-4]]
输入 round([c(0.6,-2.3), c(1.3,-3.6)])
结果 [c(1, 0), c(1, 0)]
输入 round(sparse([0,0],[0,1],[0.6,-2.3], 2, 2))
结果 [[2, 2, 0], [0, 0, 1], [0, 1, -2]]
```
### 9.1.22 度转弧度函数
```rustscript
函数
deg2rad
语法
deg2rad(x);
输入参数
x - 矩阵或标量
示例
输入 deg2rad([30, 45])
结果 [pi/6, pi/4]
输入 deg2rad([c(30, 45), c(60, 90)])
结果 [c(pi/6, pi/4), c(pi/3, pi/2)]
输入 deg2rad(sparse([0,0], [0,1], [30,45], 2, 2))
结果 [[2, 2, 0], [0, 0, pi/6], [0, 1, pi/4]]
```
### 9.1.23 弧度转度函数
```rustscript
函数
rad2deg
语法
rad2deg(x);
输入参数
x - 矩阵或标量
示例
输入 rad2deg([pi, pi/2])
结果 [180, 90]
输入 rad2deg([c(pi/6, pi/4), c(pi/3, pi/2)])
结果 [c(30, 45), c(60, 90)]
输入 rad2deg(sparse([0,0], [0,1], [pi/2,pi], 2, 2))
结果 [[2, 2, 0], [0, 0, 90], [0, 1, 180]]
```
### 9.1.24 复数取实部函数
```rustscript
函数
real
语法
real(z);
输入参数
z - 复数矩阵或复数标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 real([c(1, 2), c(3, 4)])
结果 [c(1, 0), c(3, 0)]
输入 real(sparse([c(0,0),c(0,0)],[c(0,0),c(1,0)],[c(1,2),c(3,4)], c(2,0), c(2,0)))
结果 [[c(2,0), c(2,0), c(0,0)], [c(0,0), c(0,0), c(1,0)], [c(0,0), c(1,0), c(3,0)]]
```
### 9.1.25 复数取虚部函数
```rustscript
函数
imag
语法
imag(z);
输入参数
z - 复数矩阵或复数标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 imag([c(1, 2), c(3, 4)])
结果 [c(2, 0), c(4, 0)]
输入 imag(sparse([c(0,0),c(0,0)],[c(0,0),c(1,0)],[c(1,2),c(3,4)], c(2,0), c(2,0)))
结果 [[c(2,0), c(2,0), c(0,0)], [c(0,0), c(0,0), c(2,0)], [c(0,0), c(1,0), c(4,0)]]
```
### 9.1.26 共轭复数函数
```rustscript
函数
conj
语法
conj(z);
输入参数
z - 复数矩阵或复数标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 conj([c(1, 2), c(3, 4)])
结果 [c(1, -2), c(3, -4)]
输入 conj(sparse([c(0,0),c(0,0)],[c(0,0),c(1,0)],[c(1,2),c(3,4)], c(2,0), c(2,0)))
结果 [[c(2,0), c(2,0), c(0,0)], [c(0,0), c(0,0), c(1,-2)], [c(0,0), c(1,0), c(3,-4)]]
```
### 9.1.27 复数模函数
```rustscript
函数
abs
语法
abs(z);
输入参数
z - 复数矩阵或复数标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 abs([c(3, 4), c(5, 12)])
结果 [c(5, 0), c(13, 0)]
输入 abs(sparse([c(0,0),c(0,0)],[c(0,0),c(1,0)],[c(3,4),c(5,12)], c(2,0), c(2,0)))
结果 [[c(2,0), c(2,0), c(0,0)], [c(0,0), c(0,0), c(5,0)], [c(0,0), c(1,0), c(13,0)]]
```
### 9.1.28 复数辐角函数
```rustscript
函数
arg
语法
arg(z);
输入参数
z - 复数矩阵或复数标量,若为矩阵对每个元素分别进行计算,若为稀疏矩阵仅对非零元进行计算
示例
输入 arg([c(sqrt(3), 1), c(1, 1)])
结果 [c(pi/6, 0), c(pi/4, 0)]
输入 arg(sparse([c(0,0),c(0,0)],[c(0,0),c(1,0)],[c(sqrt(3), 1),c(1, 1)], c(2,0), c(2,0)))
结果 [[c(2,0), c(2,0), c(0,0)], [c(0,0), c(0,0), c(pi/6,0)], [c(0,0), c(1,0), c(pi/4,0)]]
``` ```
### 9.2 矩阵函数 ### 9.2 矩阵函数
### 9.2.1 线性代数
### 9.2.1.1 行列式
```rustscript ```rustscript
// 线性代数 函数
det(A), inv(A), rank(A), trace(A) det
eig(A), svd(A), qr(A), chol(A) 语法
norm(A), cond(A) det(A);
输入参数
// 矩阵操作 A - 方阵
transpose(A), diag(A), triu(A), tril(A) 示例
输入 det([[1,2],[3,4]])
结果 -2
输入 det([[c(1,2),c(3,4)],[c(5,6),c(7,8)]])
结果 c(0,-16)
```
### 9.2.1.2 逆矩阵
```rustscript
运算符
^(-1)
语法
A ^ (-1);
输入参数
A - 方阵
示例
输入 [[1,2],[3,4]]^(-1)
结果 [[-2, 1], [1.5, -0.5]]
```
### 9.2.1.3 矩阵的秩
```rustscript
运算符
rank
语法
rank(A);
输入参数
A - 矩阵
示例
输入 rank([[1,2,3],[4,5,6]])
结果 2
```
### 9.2.1.4 矩阵的迹
```rustscript
运算符
trace
语法
trace(A);
输入参数
A - 方阵
示例
输入 trace([[1,2,3],[4,5,6],[7,8,9])
结果 15
输入 trace([[c(1,1), c(2,2), c(3,3)],[c(4,4), c(5,5) ,c(6,6)],[c(7,7), c(8,8), c(9,9)])
结果 c(15,15)
```
### 9.2.1.5 特征值
```rustscript
运算符
eig
语法
eig(A);
输入参数
A - 方阵,大小为N*N
返回参数
输入参数若为实数方阵,返回矩阵中第1列和第2列分别为特征值向量的实部和虚部,第3列至N+2列为右特征向量矩阵的实部,第N+3列至最后1列为右特征向量矩阵的虚部,顺序与特征值向量中元素顺序对应
输入参数若为复数方阵,返回矩阵中第1列为特征值向量,第2列至最后一列为右特征向量矩阵,顺序与特征值向量中元素顺序对应
示例
输入 eig([[4, 1], [2, 3]])
结果 [[5, 0, 0.707107, -0.447214, 0, 0], [2, 0, 0.707107, 0.894427, 0, 0]]
输入 eig([[c(0,0), c(-1,0)],[c(1,0), c(0,0)])
结果 [[c(0, 1), c(0, 0.707107), c(0, -0.707107)],
[c(0, -1), c(0.707107, 0.), c(0.707107, 0)]]
输入 eig([[c(2,0), c(-3,0)],[c(1,0), c(2,0)])
结果 [[c(2, 1.732051), c(0.866025, 0), c(0.866025, 0)],
[c(2, -1.732051), c(0, -0.5), c(0, 0.5)]]
```
### 9.2.1.6 奇异值
```rustscript
运算符
svd
语法
svd(A);
输入参数
A - 矩阵
示例
输入
结果
```
### 9.2.1.7 1范数
```rustscript
函数
norm_l1
语法
norm_l1(A);
输入参数
A - 矩阵
示例
输入 norm_l1([1, -2, 3, -4])
结果 10
输入 norm_l1([[1, -2, 3], [-4, -6, -5]])
结果 21
输入 norm_l1([c(1, 0), c(0, 2), c(-3, 4), c(5, -12)])
结果 21
输入 norm_l1(sparse([0,0,1,1], [0,1,0,1], [1,-2,3,-4], 2, 2))
结果 10
```
### 9.2.1.8 max范数
```rustscript
函数
norm_l1
语法
norm_l1(A);
输入参数
A - 矩阵
示例
输入 norm_max([1, -2, 3, -4])
结果 4
输入 norm_max([[1, -2, 3], [-4, -6, -5]])
结果 6
输入 norm_max([c(1, 0), c(0, 2), c(-3, 4), c(5, -12)])
结果 13
输入 norm_max(sparse([0,0,1,1], [0,1,0,1], [1,-2,3,-4], 2, 2))
结果 4
```
### 9.2.1.9 2范数
```rustscript
函数
norm_l2
语法
norm_l2(A);
输入参数
A - 矩阵
示例
输入 norm_l2([1, -1, 1, 2, -2, 3, -4])
结果 6
输入 norm_l2([[1, -1, 1, 2], [-2, 3, -4, 0]])
结果 6
输入 norm_l2([c(1, -1), c(1, 2), c(-2, 3), c(-4, 0)])
结果 6
输入 norm_l2(sparse([0,0,1], [0,1,0], [1,2,-2], 2, 2))
结果 3
```
### 9.2.1.10 线性方程组求解
```rustscript
函数
linsolve
语法
linsolve(A, b);
输入参数
A - 方阵
b - 向量,仅支持稠密矩阵形式
求解A * x = b
示例
输入 linsolve([[2,1], [1,-3]], [[5], [-1]])
结果 [[2], [1]]
输入 linsolve([[c(2, 0), c(1, 0)], [c(1, 0), c(-3, 0)]], [[c(5, 0)], [c(-1, 0)]])
结果 [[c(2, 0)],[c(1, 0)]]
输入 linsolve(sparse([0,0,1,1], [0,1,0,1], [2,1,1,-3], 2, 2), [[5], [-1]])
结果 [[2], [1]]
```
### 9.2.1.11 线性方程组系数矩阵转置求解
```rustscript
函数
linsolve_t
语法
linsolve_t(A, b);
输入参数
A - 方阵
b - 向量,仅支持稠密矩阵形式
求解A^T * x = b
示例
输入 linsolve_t([[2,1], [3,-1]], [[13], [1]])
结果 [[3.2], [2.2]]
输入 linsolve_t(sparse([0,0,1,1], [0,1,0,1], [2,1,3,-1], 2, 2), [[13], [1]])
结果 [[3.2], [2.2]]
输入 linsolve_t([[c(-12, 42), c(-20, 98)], [c(-16, 62), c(-24, 150)]], [[c(-548, 232)], [c(-1236, 664)]])
结果 [[c(1,2)], [c(5,6)]]
```
### 9.2.1.12
```rustscript
qr(A), chol(A)cond(A)
```
### 9.2.2 矩阵操作
### 9.2.2.1 转置
```rustscript
函数
transpose
语法
transpose(A);
输入参数
A - 矩阵
示例
输入 transpose([1, 2, 3])
结果 [[1], [2], [3]]
输入 transpose([[c(1, 1), c(2, 2)], [c(3, 3), c(4, 4)]])
结果 [[c(1, 1), c(3, 3)], [c(2, 2), c(4, 4)]]
输入 transpose(sparse([0,1,2], [1,0,1], [2, 3, 6], 3, 2))
结果 [[2, 3, 0], [1, 0, 2], [0, 1, 3], [1, 2, 6]]
```
### 9.2.2.2 共轭转置
```rustscript
函数
ctranspose
语法
ctranspose(A);
输入参数
A - 复数矩阵
示例
输入 ctranspose([[c(1, 1), c(2, 2)], [c(3, 3), c(4, 4)]])
结果 [[c(1, -1), c(3, -3)], [c(2, -2), c(4, -4)]]
输入 ctranspose(sparse([0,1,2], [1,0,1], [2, 3, 6], 3, 2))
结果 [[2, 3, 0], [1, 0, -2], [0, 1, -3], [1, 2, -6]]
```
### 9.2.2.3 对角矩阵
```rustscript
运算符
diag
语法
diag(A);
输入参数
A - 向量或张量。若A为张量,返回其对角元向量;若A为向量,返回以A为对角元的对角矩阵
示例
输入 diag([1, 2, 3])
结果 [[1, 0, 0],[0, 2, 0],[0, 0, 3]]
输入 diag([[1, 0.5, 0.3333, 0.25], [0.5, 1, 0.6667, 0.5], [0.3333, 0.6667, 1, 0.75], [0.25, 0.5, 0.75, 1]])
结果 [1, 1, 1, 1]
输入 diag(sparse([0, 1, 2], [1, 1, 2], [2, 3, 6], 3, 3))
结果 [[3, 3, 0], [1, 1, 3], [2, 2, 6]]
```
### 9.2.2.4
```rustscript
triu(A), tril(A)
reshape(A, m, n), repmat(A, m, n) reshape(A, m, n), repmat(A, m, n)
``` ```
### 9.3 张量操作函数 ### 9.3 张量操作函数
#### 9.3.1 形状和尺寸
#### 9.3.1.1 获取指定维度大小
```rustscript
函数
size
语法
size(t, dim)
输入参数
t - 张量
dim - 指定维度,若该参数为空则返回各维度大小构成的向量
示例
输入 size([[1., 0.5, 0.3, 0.2], [0.5, 1., 0.6, 0.5], [0.3, 0.6, 1., 0.7]])
结果 [3,4]
输入 size([1, 2, 3], 0)
结果 3
输入 size([[1, 2, 3]], 0)
结果 1
输入 size([[1, 2, 3]], 1)
结果 3
输入 size([[1], [2], [3]], 0)
结果 3
输入 size([[1], [2], [3]], 1)
结果 1
```
#### 9.3.1.2 获取元素总数
```rustscript
函数
length
语法
length(t)
输入参数
t - 张量,若为稀疏矩阵,返回非零元个数
示例
输入 length([1, 2, 3])
结果 3
输入 length([[c(1, 2), c(3, 4)], [c(5, 6), c(7, 8)]])
结果 c(4, 0)
输入 length(sparse([0,0], [0,1], [1,-2], 2, 2))
结果 2
```
#### 9.3.1.3 获取维度数
```rustscript
函数
ndim
语法
ndim(t)
输入参数
t - 张量
示例
输入 ndim([1, 2, 3])
结果 1
输入 ndim([[1, 2, 3]])
结果 2
输入 ndim([[1], [2], [3]])
结果 2
```
#### 9.3.1.4 元素个数
```rustscript ```rustscript
// 形状和尺寸
size(tensor, dim) // 获取指定维度大小
length(tensor) // 获取元素总数
ndims(tensor) // 获取维度数
numel(tensor) // 元素个数 numel(tensor) // 元素个数
```
// 张量切片和操作 #### 9.3.2 张量切片和操作
slice(tensor, row_range, col_range) // 张量切片操作 #### 9.3.2.1 张量切片操作
set(tensor, indices, values) // 设置张量元素值 ```rustscript
set2(tensor, indices, values) // 张量元素累加赋值 (相当于 +=) 函数
slice
语法
slice(t, row_spec, col_spec)
输入参数
t - 张量
row_spec - 行索引,数值代表单个索引,[0]代表所有行,[start,end,step]代表范围和步长
col_spec - 列索引,数值代表单个索引,[0]代表所有列,[start,end,step]代表范围和步长
返回类型
1. 使用范围参数[start, end] - 返回二维张量
col_2d = slice(a, [0], [1, 2]); // 取第2列所有行,返回3×1列向量(二维张量)
row_2d = slice(a, [1, 2], [0]); // 取第2行所有列,返回1×3行向量(二维张量)
sub_t = slice(t, [0,3], [1,4]); // 行0-2,列1-3的子矩阵(二维张量)
2. 使用单个索引 - 返回一维张量
col_1d = slice(a, [0], 1); // 取第2列所有行,返回shape为[3]的一维张量
row_1d = slice(a, 1, [0]); // 取第2行所有列,返回shape为[3]的一维张量
示例
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
输入 slice(a, [0], [1, 2])
结果 [[2], [5], [8]]
输入 slice(a, [1, 2], [0])
结果 [[4, 5, 6]]
输入 slice(a, [1, 3], [0, 2])
结果 [[4,5],[7,8]]
输入 slice(a, [0, 3, 2], [0, 3, 2])
结果 [[1,3],[7,9]]
输入 slice(a, [0], 1)
结果 [2, 5, 8]
输入 slice(a, 1, [0])
结果 [4, 5, 6]
电力系统应用示例
voltage = slice(bus, [0], [VM-1, VM]); // 所有行,VM列(二维张量)
angle = slice(bus, [0], VA-1); // 所有行,VA列(一维张量)
```
#### 9.3.2.2 设置张量元素值
```rustscript
函数
set
语法
set(t, indices, values)
输入参数
t - 张量
indices - 张量,其中元素表示t按行顺序排列的位置索引
values - 张量,形状应与indices相同,indices中索引位置元素设置为values中的对应值
示例
输入 set([[1, 2], [3, 4]], [2, 0], -3)
结果 [[-3, 2], [-3, 4]]
输入 set([[1, 2], [3, 4]], [2, 0], [-1, -3])
结果 [[-3, 2], [-1, 4]]
输入 set([c(1, 2), c(3, 4), c(5, 6), c(7, 8)], [c(1, 0), c(2, 0)], [c(-3, -4), c(-5, -6)])
结果 [c(1, 2), c(-3, -4), c(-5, -6), c(7, 8)]
输入 set(sparse([0,0],[0,1],[1,2], 2, 2), [1, 3], [3, 4])
结果 [[2, 2, 0], [0, 0, 1], [0, 1, 3], [1, 1, 4]]
```
#### 9.3.2.3 张量元素累加赋值 (相当于 +=)
```rustscript
函数
set2
语法
set2(t, indices, values)
输入参数
t - 张量
indices - 张量,其中元素表示t按行顺序排列的位置索引
values - 张量,形状应与indices相同,indices中索引位置元素设置为values中的对应值
示例
输入 set2([[1, 2], [3, 4]], [2, 0], -3)
结果 [[-2, 2], [0, 4]]
输入 set2([[1, 2], [3, 4]], [2, 0], [-1, -3])
结果 [[-3, 2], [-1, 4]]
输入 set2([c(1, 2), c(3, 4), c(5, 6), c(7, 8)], [c(1, 0), c(2, 0)], [c(-3, -4), c(-5, -6)])
结果 [c(1, 2), c(0, 0), c(0, 0), c(7, 8)]
输入 set2(sparse([0,0],[0,1],[1,2], 2, 2), [1, 3], [3, 4])
结果 [[2, 2, 0], [0, 0, 1], [0, 1, 5], [1, 1, 4]]
```
// 张量拼接 #### 9.3.3 张量拼接
horzcat(A, B, ...) // 横向拼接张量 #### 9.3.3.1 横向拼接张量
vertcat(A, B, ...) // 纵向拼接张量 ```rustscript
函数
horzcat
语法
horzcat(A, B, ...)
输入参数
A - 张量
B - 张量
输入各张量的行数应相同
示例
输入 horzcat([[1, 2, 3], [4, 5, 6]], [[7, 9], [8, 10]])
结果 [[1, 2, 3, 7, 9], [4, 5, 6, 8, 10]]
输入 horzcat([[c(1.1, -1.1), c(2.2, -2.2), c(3.3, -3.3)], [c(4.4, -4.4), c(5.5, -5.5), c(6.6, -6.6)]],
[[c(7, -7), c(8, -8)],[c(9, -9), c(10, -10)]])
结果 [[c(1.1, -1.1), c(2.2, -2.2), c(3.3, -3.3), c(7, -7), c(8, -8)],
[c(4.4, -4.4), c(5.5, -5.5), c(6.6, -6.6), c(9, -9), c(10, -10)]]
```
#### 9.3.3.2 纵向拼接张量
```rustscript
函数
vertcat
语法
vertcat(A, B, ...)
输入参数
A - 张量
B - 张量
输入各张量的列数应相同
示例
输入 vertcat([[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]])
结果 [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
输入 vertcat([[c(1.1, -1.1), c(2.2, -2.2), c(3.3, -3.3)], [c(4.4, -4.4), c(5.5, -5.5), c(6.6, -6.6)]],
[[c(7, -7), c(8, -8), c(9, -9)], [c(10, -10), c(11, -11), c(12, -12)]])
结果 [[c(1.1, -1.1), c(2.2, -2.2), c(3.3, -3.3)], [c(4.4, -4.4), c(5.5, -5.5), c(6.6, -6.6)],
[c(7, -7), c(8, -8), c(9, -9)], [c(10, -10), c(11, -11), c(12, -12)]]
```
// 序列生成 #### 9.3.4 序列生成
range(start, end) // 生成序列 [start, start+1, ..., end-1] (前闭后开) #### 9.3.4.1 生成序列 [start, start+1, ..., end-1] (前闭后开)
linspace(start, end, num) // 在start和end间生成num个等间距点 ```rustscript
range(start, end)
```
#### 9.3.4.2 在start和end间生成num个等间距点
```rustscript
linspace(start, end, num)
```
// 统计函数 #### 9.3.5 统计函数
sum(tensor), mean(tensor), std(tensor), var(tensor) #### 9.3.5.1 按维度求和
max(tensor), min(tensor), median(tensor) ```rustscript
函数
sum
语法
sum(t,d)
输入参数
t - 张量
d - 维度,可选参数
示例
输入 sum([[[1.1, 2.2], [3.3, 4.4]], [[5.5, 6.6], [7.7, 8.1]]])
结果 [[6.6, 8.8], [11.0, 12.5]]
输入 sum([[[1.3, 2.2], [3.3, 4.3]], [[5.5, 6.6], [7.7, 8.1]]], 1)
结果 [[4.4, 6.7], [13.2, 14.7]]
输入 sum([[[1.3, 2.2], [3.3, 4.3]], [[5.5, 6.6], [7.7, 8.1]]], 2)
结果 [[3.5, 7.6], [12.1, 15.8]]
输入 sum([[[1.3, 2.2], [3.3, 4.3]], [[5.5, 6.6], [7.7, 8.1]]], [0, 1])
结果 [17.8, 21.2]
输入 sum([[[1.3, 2.2], [3.3, 4.3]], [[5.5, 6.6], [7.7, 8.1]]], [0, 1, 2])
结果 39
输入 sum([[[c(1.1, 1.1), c(2.2, 2.2)], [c(3.3, 3.3), c(4.4, 4.4)]],
[[c(5.5, 5.5), c(6.6, 6.6)], [c(7.7, 7.7), c(8.1, 8.1)]]])
结果 [[c(6.6, 6.6), c(8.8, 8.8)], [c(11.0, 11.0), c(12.5, 12.5)]]
输入 sum(sparse([0,0,1,1],[0,1,0,1],[1,2,3,4], 2, 2), 0)
结果 [3, 7]
```
#### 9.3.5.2 所有元素求和
```rustscript
函数
sum_all
语法
sum_all(t)
输入参数
t - 张量
示例
输入 sum_all([[1, 2], [3, 4]])
结果 10
输入 sum_all([[c(1, 1), c(2, 2)], [c(3, 3), c(4, 4)]])
结果 c(10, 10)
输入 sum_all(sparse([0,0],[0,1],[1,2], 2, 2))
结果 3
```
#### 9.3.5.3 平均值
```rustscript
函数
mean
语法
mean(t)
输入参数
t - 张量
示例
输入 mean([[1, 2], [3, 4]])
结果 10
输入 mean([[c(1,2), c(3,4)],[c(5,6), c(7,8)]])
结果 c(4, 5)
输入 mean(sparse([0,0],[0,1],[1,2], 2, 2))
结果 1.5
```
#### 9.3.5.4 标准差
```rustscript
std(tensor)
```
#### 9.3.5.5 方差
```rustscript
var(tensor)
```
#### 9.3.5.6 最大值
```rustscript
函数
max
语法
max(t, row_spec, col_spec)
输入参数
t - 张量
row_spec - 可选参数,行索引,数值代表单个索引,[0]代表所有行,[start,end,step]代表范围和步长
col_spec - 可选参数,列索引,数值代表单个索引,[0]代表所有列,[start,end,step]代表范围和步长
示例
输入 max([[1, 2], [3, 4]])
结果 4
输入 max([[1, 2], [3, 4]], [0], 0)
结果 3
输入 max([[c(1, 1), c(2, 2)], [c(3, 3), c(4, 4)]])
结果 c(4, 4)
输入 max(sparse([0,0,1,1],[0,1,0,1],[1,2,3,4], 2, 2))
结果 4
```
#### 9.3.5.7 最小值
```rustscript
函数
min
语法
min(t, row_spec, col_spec)
输入参数
t - 张量
row_spec - 可选参数,行索引,数值代表单个索引,[0]代表所有行,[start,end,step]代表范围和步长
col_spec - 可选参数,列索引,数值代表单个索引,[0]代表所有列,[start,end,step]代表范围和步长
示例
输入 min([[1, 2], [3, 4]])
结果 1
输入 min([[1, 2], [3, 4]], [0], 1)
结果 2
输入 min([[c(1, 1), c(2, 2)], [c(3, 3), c(4, 4)]])
结果 c(1, 1)
输入 min(sparse([0,0,1,1],[0,1,0,1],[1,2,3,4], 2, 2))
结果 1
```
#### 9.3.5.8 中位数
```rustscript
median(tensor)
//其中,max()和min()可以如下用法:max(a, [0],1),min(a, [0],1),参数和slice函数的定义相同 //其中,max()和min()可以如下用法:max(a, [0],1),min(a, [0],1),参数和slice函数的定义相同
```
// 查找函数 #### 9.3.6 查找函数
find(condition) // 查找满足条件的索引 #### 9.3.6.1 查找非零元素
any(tensor), all(tensor) ```rustscript
函数
find
语法
find(t)
输入参数
t - 张量
示例
输入 find([1, 0, 3, 0])
结果 [0, 2]
输入 find([[c(1, 0), c(0, 0)], [c(0, 3), c(0, 0)]])
结果 [c(0, 0), c(2, 0)]
输入 find(sparse([0,0],[0,1],[1,-2], 2, 2))
结果 [[2, 2, 0], [0, 0, 1], [0, 1, -2]]
```
#### 9.3.6.2 查找最接近指定值的元素
```rustscript
函数
find_nearest
语法
find_nearest(t, v)
输入参数
t - 张量,若为稀疏矩阵,仅查找非零元
v - 标量
示例
输入 find_nearest([1, 2.1, 3], 2)
结果 2.1
输入 find_nearest([c(1, 2), c(1, 3), c(2, 2), c(2, 3)], c[1, 2.6])
结果 c(1, 3)
输入 find_nearest(sparse([0,0],[0,1],[1,-2], 2, 2), -1)
结果 -2
```
#### 9.3.6.3 查找最接近指定值的元素位置
```rustscript
函数
find_nearest_pos
语法
find_nearest_pos(t, v)
输入参数
t - 张量,若为稀疏矩阵,仅查找非零元
v - 标量
若有多个元素与指定值,返回第一个元素位置
示例
输入 find_nearest_pos([4, 3, 1], 2)
结果 [1]
输入 find_nearest_pos([c(1, 2), c(1, 3), c(2, 2), c(2, 3)], c[1, 2.6])
结果 [c(1, 0)]
输入 find_nearest_pos(sparse([0,0],[0,1],[1,-2], 2, 2), -1)
结果 [0, 1]
```
#### 9.3.6.4 检测指定维度是否存在非零元素
```rustscript
函数
any
语法
any(t,d)
输入参数
t - 张量
d - 维度
示例
输入 any([0, 2, 3])
结果 1
输入 any([0, 0, 0])
结果 0
输入 any([[0,1,2], [0, 0, 0], [0, -3, 5]], 0)
结果 [0, 1, 1]
输入 any([[0,1,2], [0, 0, 0], [0, -3, 5]], 1)
结果 [1, 0, 1]
输入 any([c(0, 0), c(0, 2), c(3, 0)])
结果 c(1,0)
输入 any(sparse([0, 1, 2], [1, 0, 1], [2, 3, 6], 3, 3))
结果 [[3, 1, 0], [0, 0, 1], [1, 0, 1], [2, 0, 1]]
```
#### 9.3.6.5 检测张量是否为空
```rustscript
函数
is_empty
语法
is_empty(t)
输入参数
t - 张量。若为稠密矩阵,检测矩阵是否为空;若为稀疏矩阵,则检测是否存在非零元
示例
输入 is_empty([])
结果 1
输入 is_empty([c(0, 0)])
结果 [c(0, 0)]
输入 is_empty(sparse([],[],[], 2, 2))
结果 1
```
#### 9.3.6.6 检测是否无穷数
```rustscript
函数
is_inf
语法
is_inf(t)
输入参数
t - 张量
示例
输入 is_inf([[0, INF], [2, NEG_INF]])
结果 [[0, 1],[0, 1]]
输入 is_inf([c(0, INF), c(NEG_INF, 3), c(4, 5)])
结果 [c(1, 0), c(1, 0), c(0, 0)]
输入 is_inf(sparse([0,0,1], [0,1,0], [0,INF,NEG_INF], 2, 2))
结果 [[2, 2, 0], [0, 0, 0], [0, 1, 1], [1, 0, 1]]
```
#### 9.3.6.7 检测所有元素是否非零
```rustscript
all(tensor)
```
// 获取多个元素 #### 9.3.7 获取多个元素
get_multi(tensor, indices) // 根据索引获取多个元素(可不连续) #### 9.3.7.1 根据索引获取多个元素(可不连续)
```rustscript
函数
get_multi
语法
get_multi(t, indices);
输入参数
t - 张量
indices - 张量,其中元素表示t按行顺序排列的位置索引
示例
输入 get_multi([1, 2, 3, 4], [1, 3])
结果 [2, 4]
输入 get_multi([c(1, 2), c(3, 4), c(5, 6), c(7, 8)], [c(1, 0), c(2, 0)])
结果 [c(3, 4), c(5, 6)]
``` ```
### 9.4 稀疏矩阵 ### 9.4 稀疏矩阵
### 9.4.1 创建稀疏矩阵
### 9.4.1.1 由三元组创建稀疏矩阵
```rustscript ```rustscript
// 创建稀疏矩阵 函数
sparse(row_indices, col_indices, values, m, n); // 创建m×n稀疏矩阵,其中row_indices, col_indices, values是三个等长的向量,分别指定非零元素的行下标、列下标和值。 sparse
语法
// 稀疏矩阵操作 sparse(row, col, v, m, n);
full_mat = full(sparse_mat); // 转为密集矩阵 输入参数
nnz_count = nnz(sparse_mat); // 非零元素个数 row - 向量,行索引
spy(sparse_mat); // 显示稀疏模式 col - 向量,列索引
v - 向量,值
m - 稀疏矩阵行数
n - 稀疏矩阵列数
row、col和v的长度应相等
示例
输入 sparse([0, 1, 2], [1, 0, 1], [2, 3, 6], 3, 2)
结果 [[3, 2, 0], [0, 1, 2], [1, 0, 3], [2, 1, 6]]
```
### 9.4.2 稀疏矩阵操作
### 9.4.2.1 转为稠密矩阵
```rustscript
函数
full
语法
full(t);
输入参数
t - 稀疏矩阵
示例
输入 full(sparse([0, 1, 1], [1, 0, 2], 2, 3))
结果 [[0, 2, 0], [4, 0, 6]]
```
#### 9.4.2.2 非零元素个数
```rustscript
nnz_count = nnz(sparse_mat);
```
#### 9.4.2.3 显示稀疏模式
```rustscript
spy(sparse_mat);
``` ```
### 9.5 张量操作详细示例 ### 9.5 张量操作详细示例
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论