FreeBlues 发表于 2024-3-12 03:50:27

WP 34S固件程序库中矩阵库的介绍

本帖最后由 FreeBlues 于 2024-3-12 04:04 编辑

最近在研究WP34S,发现它的矩阵功能很有特色,不仅提供了一些基本的矩阵命令,而且在固件的程序库中也有相关的矩阵库,下面就是详细介绍。

首先翻译它的说明文档(https://sourceforge.net/p/wp34s/code/HEAD/tree/doc/matrix.txt#l230)
----
有许多内置的与矩阵相关的命令。这些命令中的许多被设计为提供创建更有用的矩阵功能作为按键程序的低级支持例程。也就是说,它们对应于34S矩阵支持的BLAS。其他的执行高级操作(例如矩阵乘法、LU分解),并且它们本身就很有用。

这些命令中的一些是可选的,并且可以通过构建时选项来包含或排除。目前,有以下选项可用:

选项                              默认值
----------------------------------------
MATRIX_LU_DECOMP                启用
MATRIX_ROWOPS                启用
SILLY_MATRIX_SUPPORT                禁用

所有这些例程都会接受或创建一个矩阵描述符。这是一个格式如下的实数:

bb.rrcc

其中:
bb 是基础寄存器(00 - 99)。
rr 是矩阵中的行数(01 - 99)。
cc 是矩阵中的列数(01 - 99)。如果省略了cc,就使用rr的值,并假定矩阵是正方形的。

矩阵命令【说明】这部分可以查阅中文手册,内容更详细

TRANSP - 矩阵转置。

接受X中的矩阵描述符(以bb.ccrr格式),并返回X的转置描述符(bb.rrcc)。
转置是就地完成的,不需要任何额外的寄存器或存储。在RPN中完成这是有点棘手的。

M - 矩阵乘法

接受Y和Z中的矩阵描述符,以及X的整数部分作为结果的基础。它计算X = Z * Y。
X的小数部分更新以匹配结果矩阵,不执行重叠检查。所有计算都在高精度内部完成,尽管仍然可能欺骗代码并产生不良结果。在RPN中获得相同程度的精度将非常困难,因为最容易实现的是a*b+c*d,而矩阵乘法增加了比这更多的项。

M+ - 广义矩阵加法。

接受z中的实数和Y和X中的矩阵描述符。
计算X = X + z * Y。即,矩阵的标量倍数被加到另一个矩阵上。再次,乘法增加在扩展精度中完成,结果应该是精确四舍五入的。这在RPN中是可能的,而不会失去精度,但同样有点棘手。

MROW[<-->] (类似于PPC M1)可选:MATRIX_ROWOPS

接受X中的矩阵描述符,以及Y和Z中的两个行号。它在矩阵中交换这两个行。栈未修改。

MROW (类似于PPC M2)可选:MATRIX_ROWOPS

接受X中的矩阵描述符,Y中的行号和z中的常数。它将矩阵的指定行乘以z。栈未修改。

MROW+ (类似于PPC M3)可选:MATRIX_ROWOPS

接受X中的矩阵描述符,Y中的目的地行号,Z中的源行号和t中的常数。它将行Z的内容乘以t并将其加到行Y上。即X[*:Y] = X[*:Y] + t * X[*:Z]。栈未改变。

M.IJ (类似于PPC M4)。

接受X中的矩阵描述符和Y中的寄存器号。返回寄存器表示的列在Y中,以及X中的行。矩阵描述符保存在最后一个X中。

M.REG (类似于PPC M5)。

接受X中的矩阵描述符,Y中的行号和Z中的列号。返回X中的寄存器索引(弹出栈两次)。矩阵描述符保存在最后一个X中。

M-ALL

接受X中的矩阵描述符,并返回一个适合ISG或DSL循环的值在X中(并像所有好的命令一样设置最后一个X)。循环处理矩阵中的所有元素。
如果描述符是负数,循环索引是DSL,对于正数是ISG。

M-DIAG

接受X中的矩阵描述符,并返回一个适合ISG或DSL循环的值在X中(并适当设置最后一个X)。循环处理矩阵对角线上的所有元素。
如果描述符是负数,循环索引是DSL,对于正数是ISG。

M-ROW

接受X中的矩阵描述符和Y中的行号。它返回一个适合在X中循环的值(丢弃栈并像所有双参数命令一样设置最后一个x)。
循环仅处理指定行中的所有元素。
如果描述符是负数,循环索引是DSL,对于正数是ISG。

M-COL

接受X中的矩阵描述符和Y中的列号。
它返回一个适合在X中循环的值(再次像双参数命令一样)。循环仅处理指定列中的所有元素。如果描述符是负数,循环索引是DSL,对于正数是ISG。

nROW

接受X中的矩阵描述符并返回矩阵中的行数。描述符保存在LastX中。

nCOL

接受X中的矩阵描述符并返回矩阵中的列数。描述符保存在LastX中。

M.SQR?

接受X中的矩阵描述符,并在矩阵不是正方形时跳过下一步。

M.IDEN 未包含 可选:SILLY_MATRIX_SUPPORT

接受X中正方形矩阵的矩阵描述符,并将相应的寄存器填充,使其成为单位矩阵。

M.ZERO 未包含 可选:SILLY_MATRIX_SUPPORT

接受X中的矩阵描述符,并将对应于矩阵的寄存器置零。栈保持不变。

M.COPY

接受Y中的矩阵描述符和X中的寄存器号。将矩阵复制到从X开始的寄存器中。返回X中正确形成的矩阵描述符。

DET

接受X中的矩阵描述符并返回矩阵的行列式。矩阵必须是正方形的,且不会被修改。

M.LU 未包含 可选:MATRIX_LU_DECOMP

接受X中的矩阵描述符并将矩阵修改为其LU分解。矩阵必须是正方形的,并且就地修改。X中的值被替换为一个枢轴描述符,定义了计算分解所需的枢轴。最高有效位是第一个对角线条目的枢轴,下一个最高有效位是第二个,依此类推。

LINEQS

接受Z中的正方形矩阵描述符,y中的向量矩阵描述符和x中的基寄存器,并解线性方程组Zx = y。返回填充的矩阵描述符在X中。

M^-1

接受X中的正方形矩阵描述符,并就地反转矩阵。不改变栈。

错误提示

"超出范围"是指矩阵描述符会超出可用寄存器的范围,或者行或列索引太大或为负数。
"参数错误"如果列数为零。
"矩阵维度"是指矩阵不是正方形的时候应该是,或者矩阵大小不匹配。
"奇异错误"是指矩阵被LU分解、用来解方程组或被反转时不是满秩的。


矩阵库

这些是作为用户按键程序编码的例程。它们通常不如上述函数表现良好。它们还需要在可用之前加载到计算器上。

'M-1'
接受X中的矩阵描述符并初始化一个单位矩阵(对角线以下为1,其余位置为0)。X被保留,L被覆盖。

'M-0'.
接受X中的矩阵描述符并初始化一个零矩阵。X被保留,L被覆盖。

'ATR'
接受X中的矩阵描述符并返回对角线元素绝对值之和。清除标志C。需要三个栈级别,L被覆盖。

'TR'
接受X中的矩阵描述符并返回矩阵的迹。清除标志C。需要三个栈级别,L被覆盖。

'M-'
接受X和Y中的矩阵描述符。从矩阵X中减去矩阵Y。栈级别X和Y不变。Z被设置为-1,此级别以上的级别上移一位。

'M+'
接受X和Y中的矩阵描述符。从矩阵X中加上矩阵Y。栈级别X和Y不变。Z被设置为1,此级别以上的级别上移一位。

'M-y'
接受X中的矩阵描述符和y中的标量常数。将X乘以y。退出时原始矩阵描述符在L中。两个参数都从栈中消失。

'FNM'
接受X中的矩阵描述符。计算矩阵的弗罗贝尼乌斯范数。覆盖栈和L。

'RNM'
接受X中的矩阵描述符。计算矩阵的行范数。覆盖栈、A、B、C、D和L。清除标志C。

'CNM'
接受X中的矩阵描述符。计算矩阵的列范数。覆盖栈、A、B、C、D和L。清除标志C。

'MFD'
接受X中的矩阵描述符和Y中的值。查找矩阵中第一个匹配的元素并返回该元素的寄存器编号。

'M[^]'
接受X中的矩阵描述符并返回矩阵中的最大值。使用两个栈级别并覆盖L。

'M'
接受X中的矩阵描述符并返回矩阵中的最小值。使用两个栈级别并覆盖L。

'MIO'
查看/输入整个矩阵的元素。进入时矩阵描述符在X中。依次查看和/或修改每个元素,每输入一个元素后按R/S。原始矩阵描述符保留在L中。栈被覆盖。I被覆盖。

'MRC'
查看/输入矩阵的单个元素。进入时矩阵描述符在X中。对于每个元素,输入行然后是列并按R/S。查看元素的值并选择性地更改它,然后再次按R/S。原始矩阵描述符保留在L中。栈被覆盖。I被覆盖。

'MED'
更复杂的交互式矩阵编辑器。
查看library/matrixedit.wp34s以获取完整说明。
用描述符X启动。使用箭头键导航。
输入数字将暂停编辑器并允许输入值。按R/S输入值并继续。按<- 优雅地退出编辑器。描述符在A中。




molucule 发表于 2024-3-12 09:08:49

看看海鲜上200左右的prime,其它计算器瞬间不香了;
不过我20块的17bii性价比依然很高。

FreeBlues 发表于 2024-3-12 12:14:33

本帖最后由 FreeBlues 于 2024-3-12 12:16 编辑

molucule 发表于 2024-3-12 09:08
看看海鲜上200左右的prime,其它计算器瞬间不香了;
不过我20块的17bii性价比依然很高。 ...
prime现在也不太贵了,不过我下载了模拟器
话说WP34s确实好玩,尤其是对底层存储的访问功能,太有意思了!
页: [1]
查看完整版本: WP 34S固件程序库中矩阵库的介绍