首页/文章/ 详情

APDLMath箱内矩阵可扩展可裁剪,初始化与范数计算较为简便

3年前浏览1692

前文介绍了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!存在问题

!!==========================

声明:原创文章,欢迎留言与我讨论,如需转载留言

理论科普代码&命令其他软件
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-01-21
最近编辑:3年前
王新敏
硕士 | 教授 好好学习,天天快乐
获赞 122粉丝 613文章 96课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈