 
等级: 超级版主
- 注册:
- 2021-5-18
- 曾用名:
|
本帖最后由 代人发帖 于 2023-6-7 11:36 编辑
为了方便用户进行线性代数与矢量分析,金字塔提供了一整套封装的高度矢量优化线性代数方面函数,用户可以不借助Python也可以在PEL中进行简易矩阵及向量计算。金字塔会根据用户CPU自动启用SSE,AVX,AVX-512指令集,以及高度并行化执行,可以发挥CPU最大利用率,执行效率大大提升。
使用事项说明
1、该类函数的向量及矩阵的输入参数只能是VARIABLE申明的数组类型,使用前应注意转换。相关的教程请参考金字塔数组使用的高级编程技巧
2、函数计算需依赖科学计算组件,该组件您需要单独安装部署,使用前请先进行在线安装。
安装步骤 : PEL公式编辑器界面->插入菜单->安装扩展科学计算组件。
3、该类库函数还在不断扩充中,如果你有其他的功能函数需求,欢迎及时在本贴中提出,以便我们进行扩充安排。
函数说明(5.0 BETA3版本后支持)
1、Mfsum(X,N)
计算向量x的元素大小之和
函数实现功能: y=∑x
参数维度说明: x为向量(n*1)(矩阵也可以看做向量)
例:
[PEL] 复制代码 1 2 3 | VARIABLE :x[]= 0 ;
x:= c ;
rets: Mfsum (x, 5 );
|
========================================
2、Mfxpy(x,y,alpha,n)
计算向量与标量的积,然后加到结果上
函数实现功能:y:=a*x+y
x : 向量
y : 向量(输出参数)
alpha : 标量
n : 指定向量x,y的元素个数
返回值 : 最终更新到向量y
例:
[PEL] 复制代码 1 2 3 4 5 6 7 8 9 | alpha:= 1 ;
VARIABLE : x[ 5 ]=( 0 , 1 , 2 , 3 , 4 );
VARIABLE : y[ 5 ]=( 1 , 2 , 3 , 4 , 5 );
If IsLastbar Then
Begin
MFXPY (x,y,ALPHA, 5 );
for i = 1 to 5 do
msgout ( 1 , numtostr (y[i], 0 ));
End
|
========================================
3、Mfdot(x,y,n)
计算向量-向量的点乘
函数实现功能公式:

x : 向量
y : 向量
n:向量x,y数量
例:
[PEL] 复制代码 1 2 3 | VARIABLE : x[ 5 ]=( 0 , 1 , 2 , 3 , 4 );
VARIABLE : y[ 5 ]=( 1 , 2 , 3 , 4 , 5 );
RETS: MFDOT (x,y, 5 );
|
========================================
4、Mfnrm2(x,n)
计算一个向量的欧几里得范数(Euclidean norm)
函数实现功能:res = ||x||
x:向量
n:向量x个数
例:
[PEL] 复制代码 1 2 | VARIABLE : x[ 5 ]=( 1 , 2 , 3 , 4 , 5 );
RETS: MFNRM2 (x, 5 );
|
========================================
5、Mfscal(x,a,n)
计算向量和标量的乘积 函数实现功能:x=a*x x : 向量(输入/输出参数) a : 标量a n: 向量x个数 返回值:最终更新到向量x
例: [PEL] 复制代码 1 2 3 4 5 6 7 8 9 | VARIABLE : x[ 5 ]=( 1 , 2 , 3 , 4 , 5 );
a:= 0.1 ;
If IsLastbar Then
Begin
MFSCAL (x,a, 5 );
for i = 1 to 5 do
Msgout ( 1 , numtostr (x[i], 1 ));
End
|
========================================
6、Mfswap(x,y,n)
交换向量值, 完成向量x和y的交换 x : 向量 y : 向量 n:向量x,y数量 例:
[PEL] 复制代码 01 02 03 04 05 06 07 08 09 10 | <i> VARIABLE : x[ 5 ]=( 0 , 1 , 2 , 3 , 4 );
VARIABLE : y[ 5 ]=( 1 , 2 , 3 , 4 , 5 );
If IsLastbar Then
Begin
Mfswap (x,y, 5 );
for i = 1 to 5 do
msgout ( 1 , numtostr (y[i], 0 ));
End
</i>
|
======================================== 7、mfamax(x,n) 找到绝对值最大的元素的索引 x: 向量 n: 向量x个数 返回值:基于1索引的向量元素位置 例: ========================================
[PEL] 复制代码 1 2 3 | <i><i> VARIABLE : x[ 5 ]=( 0 , 1 , 2 , 3 , 4 );
Rets: MFAMAX (x, 5 );
</i></i>
|
8、Mfamin(x,n) 找到绝对值最小的元素的索引 x: 向量 n: 向量x个数 返回值:基于1索引的向量元素位置 例:见Mfamax函数 ======================================== 9、mfAdd(a,b,r,n) 向量元素相加 a : 向量 b : 向量 r:向量(输出值) n: 向量a,b,r个数
例: [PEL] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 | VARIABLE : a[ 5 ]=( 1 , 2 , 3 , 4 , 5 );
VARIABLE : b[ 5 ]=( 1 , 2 , 3 , 4 , 5 );
VARIABLE : r[ 5 ]= 0 ;
If IsLastbar Then
Begin
MFADD (a,b,r, 5 );
for i = 1 to 5 do
msgout ( 1 , numtostr (r[i], 0 ));
End
|
========================================
10、MfSub(a,b,r,n)
向量元素相减 a : 向量 b : 向量 r : 向量(输出值) n: 向量a,b,r个数
例:见mfAdd函数
========================================
11、MfMul(a,b,r,n)
向量元素相乘 a : 向量 b : 向量 r:向量(输出值) n: 向量a,b,r个数
例:见mfAdd函数
========================================
12、MfDiv(a,b,r,n)
向量元素相除 a : 向量 b : 向量 r:向量(输出值) n: 向量a,b,r个数
例:见MfAdd函数
========================================
13、Mfgemv(a,x,y,t,m,n,alpha,beta) 矩阵与向量的乘积 函数实现功能: t =0 y := alpha*A*x + beta*y, t =1 y := alpha*A'*x + beta*y, t =2 y := alpha*conjg(A')*x + beta*y, a : m*n的矩阵 x : 向量 y : 向量(输入和输出参数) m : 矩阵A的行数 n : 矩阵A的列数(向量x维度) alpha : 标量 beta : 标量 返回值:最终更新到向量y
例: [PEL] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | m:= 2 ;
n:= 5 ;
alpha:= 1 ;
mbeta:= 1 ;
VARIABLE : a[m*n]=( 0 , 1 , 2 , 3 , 4 ,
5 , 6 , 7 , 8 , 9 );
VARIABLE : x[n]=( 1 , 2 , 3 , 4 , 5 );
VARIABLE : y[m]= 0 ;
If IsLastbar Then
Begin
MFGEMV (a,x,y, 0 ,m,n,alpha,mbeta);
for i = 1 to m do
msgout ( 1 , numtostr (y[i], 0 ));
End
|
========================================
14、Mfger(x,y,a,m,n,alpha)
矩阵的一阶更新(矩阵-向量乘积) 函数实现功能:A := alpha*x*y'+ A, x : 向量(m行) y : 向量(n列) a : m×n 的矩阵(输入和输出参数) m : 矩阵A的行数 n : 矩阵A的列数 alpha : 标量 返回值:最终更新到矩阵a
例: [PEL] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <i>m:= 2 ;
n:= 5 ;
alpha:= 1 ;
VARIABLE : x[m]=( 1 , 2 );
VARIABLE : y[n]=( 2 , 3 , 4 , 5 , 6 );
VARIABLE : a[m*n]=( 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 );
If IsLastbar Then
Begin
MFGER (x,y,a,m,n,alpha);
for i = 1 to m*n do
msgout ( 1 , numtostr (a[i], 0 ));
End
3 4 5 6 7
5 7 9 11 13 </i>
|
======================================== 15、Mfgemm(A,B,C,alpha,beta,m,n,k)
矩阵与矩阵乘积
函数实现功能:C := alpha*op(A)*op(B) + beta*C, A: 矩阵 B: 矩阵 C:矩阵(输入和输出参数) alpha: 标量 beta : 标量 m:矩阵A和矩阵C的行数 n:矩阵B和矩阵C的列数 k:矩阵A的列数和矩阵B的行数 返回值:最终更新到矩阵C 例:
[PEL] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <i><i>m:= 2 ;
n:= 3 ;
k:= 2 ;
alpha:= 1 ;
betas:= 1 ;
VARIABLE : a[m*n]=( 1 , 2 , 3 , 4 , 5 , 6 );
VARIABLE : b[n*k]=( 1 , 1 , 1 , 1 , 1 , 1 );
VARIABLE : x[m*k]=( 0 , 1 , 2 , 3 );
If IsLastbar Then
Begin
MFGEMM (a,b,x,alpha,betas,m,n,k);
for i = 1 to m*k do
msgout ( 1 , numtostr (x[i], 0 ));
End
6 7
1718
</i></i>
|
========================================
16、Mffft(X,Y,N,T)
快速傅立叶变换 X: 输入源向量数组 Y: 输出向量数组,以复数方式返回(由2个数字组成),因此数组申明大小必须为X的2倍 N: X向量变换源数组大小 T:0向前变换 1向后变换
例: [PEL] 复制代码 1 2 3 4 5 6 7 8 9 | n:= 16 ;
VARIABLE : x[n]=( 15 , 32 , 9 , 222 , 118 , 151 , 5 , 7 , 56 , 233 , 56 , 121 , 235 , 89 , 98 , 111 );
VARIABLE : y[n* 2 ]= 0 ;
If IsLastbar Then
Begin
MFFFT (x,y,n, 0 );
for i = 1 to n* 2 do
msgout ( 1 , numtostr (y[i], 3 ));
End
|
|
|