前文介绍了APDLMath箱内矩阵的加减乘除运算,这里介绍箱内矩阵的扩展与裁剪,矩阵的初始化,范数计算、向量排序、压缩等运算。
1.矩阵和向量的初始化
命令*INIT初始化以*DMAT、*SMAT或*VEC创建的矩阵。
*INIT,Name,Method,Val1,Val2,Val3
其中Name为要初始化的既有稠密矩阵名或向量名。
Method为初始化方法,可选择:ZERO--充0(缺省)。CONST--充常数。RAND--充随机数(无太大意义)。
DIAG--对角元素充常数且保留其他元素值,而ADIAG--对反对角元素充常数,此时Val1为对角元素编号,Val1=0表示主对角(或主反对角),正值表示上三角(从主对角为0开始,依次向右为1、2、3……n斜对角),负值表示下三角(从主对角为0开始,依次向下为1、2、3……n斜对角),Val2为实部的常数值,Val3为虚部的常数值(缺省为0)。
CONJ--取复共轭值替换,非复数值不变。
FILTER--使用过滤向量初始化向量值的子集,Name必须为向量。此时,Val1为做为过滤既有整型向量名,该过滤向量的元素值表示Name向量中的位置,该位置的值被Val2(实部)和Val3(虚部)初始化,过滤向量中元素值不在Name大小范围时都会出错。该项也无多大意义,也可以直接修改Name元素值。
2.矩阵和向量扩展
命令*MERGE为扩展矩阵或合并两个稠密矩阵或向量,即扩展某个矩阵,将另外某个矩阵整体复制进来。
*MERGE,Name1,Name2,Val1,Val2
其中Name1为要扩展的矩阵或向量名,Name2为被合并的矩阵或向量名,且两个矩阵或向量必须同类型。Val1为插入到Name1矩阵位置的行号或列号,Val2为指定Name2矩阵如何插入到矩阵Name1,Val2=COL按列号位置插入(行数匹配),Val2=ROW按行号位置插入(列数匹配)。
扩展后的矩阵或向量自动改变行数和列数。
3.矩阵和向量裁剪
命令*REMOVE为矩阵裁剪,是删除矩阵某些行或列或向量的某些元素。
*REMOVE,Name,Val1,Val2,Val3
其中Name为要裁剪的稠密矩阵名或向量名,裁剪后矩阵自动调整行数和列数。
当为矩阵时,Val1表示起始行号或列号,Val2为结束行号或列号,Val3=COL按列或Val3=ROW按行裁剪。
当为向量时,Val1表示起始位置号,Val2为结束位置号。
4.矩阵压缩
命令*COMP为矩阵压缩(向量除外),且可采用3种算法对矩阵进行压缩。
*COMP,Matrix,Algorithm,THRESHOLD,Val1,Val2
其中Matrix为要压缩的矩阵名。Algorithm可选用三种算法,SVD—奇异值分解算法(缺省),MGS—MGS算法(改进的Gram-Schmidt算法),SPARSE—基于阈值的压缩稀疏矩阵算法。THRESHOLD为阈值,缺省时SVD为1E-7,MGS为1E-14,稀疏压缩算法为1E-16。
对SVD算法,Val1为储存Σ值的向量名(可选),Val2为储存V*输出矩阵的稠密矩阵名(可选)。
注意,SVD和MGS仅支持稠密矩阵压缩,系数矩阵压缩算法仅支持稀疏矩阵。
5.向量排序
命令*SORT为按指定方法对向量排序,如最大值、绝对值等方法。
*SORT,Name,SortType,Val1,Val2
其中Name为要排序的向量名,该向量可为复向量。排序规则:VALUE--按值排序(缺省),ABS—按绝对值排序,PERM—基于给定的向量排序(Val1为该向量名)。Val2为升降序设置,Val2=0为升序,Val2=1为降序。
6.矩阵和向量的范数
命令*NRM按指定方法计算矩阵或向量的范数。
*NRM,Name,NormType,ParR,Normalize
其中Name为要计算范数的矩阵名或向量名。NormType为范数计算类型,NRM2--L2范数(缺省),NRM1--L1范数(仅向量),NRMINF—最大值范数。ParR为结果参数名。Normalize为归一化设置(仅支持向量),YES—归一化向量使其范数为1.0,NO—不做归一化处理(缺省)。该命令的归一化运算尚存在问题(慎用)。
!=========================
!*INIT矩阵初始化
!先定义一个稠密矩阵
*DMAT,A_M,D,ALLOC,4,4
!充0
*INIT,A_M,ZERO$*PRINT,A_M
!充常数(-1)
*INIT,A_M,CONST,-1
!*PRINT,A_M
!充随机数(不变,没意义)
*INIT,A_M,RAND$*PRINT,A_M
!充主对角元素(8)
*INIT,A_M,ZERO
*INIT,A_M,DIAG,0,8
!*PRINT,A_M!
!充反主对角元素(2)
*INIT,A_M,ZERO!
*INIT,A_M,ADIAG,0,2
!充上三角的对角元素
*INIT,A_M,ZERO!!
*INIT,A_M,DIAG,2,-1
*PRINT,A_M!!
!充下三角的对角元素
*INIT,A_M,ZERO!!!
*INIT,A_M,DIAG,-1,8
*PRINT,A_M!!!!
!向量过滤
*VEC,B_M,D,ALLOC,10
*VEC,C_M,I,ALLOC,6
*DO,I,1,10
B_M(I)=I*2$*ENDDO
!B_M值为2,4,6,8,…,20
*DO,I,1,6
C_M(I)=I$*ENDDO
!C_M值为1,2,3,4,5,6
*DO,I,1,3
C_M(I)=4$*ENDDO
!修改C_M前3个均为4
*INIT,B_M,FILTER,C_M,125.5
*FREE,ALL!删除所有向量
I=
*STAT
!===========================
!*MERGE矩阵扩展
*DMAT,A_M,D,ALLOC,4,4!
*DO,I,1,4
*DO,J,1,4
A_M(I,J)=I J/10 J/100
*ENDDO
*ENDDO!!
!A_M值为"I.JJ"样子,如2.33
*DMAT,A0_M,D,COPY,A_M
!将矩阵A0_M插入到A_M的第3列
*MERGE,A_M,A0_M,3,COL
*PRINT,A_M
!A_M成为4×8的矩阵
!接着再在最后插入一次
*MERGE,A_M,A0_M,9,COL
!A_M为4×12的矩阵
!向量的合并(向量=列向量)
*VEC,B_M,D,ALLOC,5
*VEC,C_M,D,ALLOC,3
*INIT,B_M,CONST,-1
*PRINT,B_M
*INIT,C_M,CONST,6
*PRINT,C_M
!将C_M插入到B_M的第2个
*MERGE,B_M,C_M,2
!B_M为8个元素的向量
!再扩展B_M时出错
!========================!!!
!*REMOVE矩阵裁剪
!去掉A_M的7-12列
*REMOVE,A_M,7,12,COL
!A_M修改为4×6的矩阵
!去掉B_M的4-8元素
*REMOVE,B_M,4,8
!B_M修改为3个元素的向量
!=========================!!
!*COMP矩阵压缩
*COMP,A_M,SVD
!把4×6的矩阵压缩成了4×2了
!==========================!
!*SORT向量排序
!创建向量V1并赋值
*VEC,V1,I,ALLOC,5
V1(1)=5,-3,2,0,-1
!按值排序
*SORT,V1,VALUE$*PRINT,V1
!按绝对值排序
*SORT,V1,ABS,,1$*PRINT,V1
!创建排序向量V2并赋值
*VEC,V2,I,ALLOC,5
V2(1)=3,5,4,1,2
!按V2顺序排V1向量
*SORT,V1,PERM,V2$*PRINT,V1
!============================
!*NRM范数计算
*NRM,A_M,NRM1,PARR1
!PARR1=1.85202919
*NRM,V1,NRM2,PARR2
!PARR2=6.244998
*NRM,V1,NRM2,PARR2,YES
*PRINT,V1!存在问题
!!==========================
声明:原创文章,欢迎留言与我讨论,如需转载留言