Maxima:将矩阵转换为列表

12

我在Maxima中通过以下方式将列表转换为矩阵:

DataL : [ [1,2], [2,4], [3,6], [4,8] ];
DataM: apply('matrix,DataL);

如何以另一种方式实现? 如何将给定的矩阵DataM转换为列表DataL

2个回答

17

我知道现在可能有点晚了,但是说句实话,还有一种更简单的方法。

my_matrix : matrix ([a, b, c], [d, e, f]);
my_list : args (my_matrix);
 => [[a, b, c], [d, e, f]]

1
@Grzegorz 你能把勾选标记移到Robert的回答上吗?因为这似乎是更合理的做法。 - Simon
1
@Simon 合理的观点 - 刚刚解决了。但是,我不记得原因了,因为我正在编写更长的 Maxima 脚本,在我的情况下,你的解决方案效果更好或更方便。无论如何 - “勾”已经被移动了。感谢你们俩的帮助,祝好! - Grzegorz Wierzowiecki

7

我远非Maxima专家,但既然你要求我看这个问题,在快速查阅文档后,以下是我的发现。

首先,查看矩阵文档只提供了一种将矩阵转换为列表的方法,即list_matrix_entries。但是,这会返回一个扁平的条目列表。要获取嵌套的列表结构,可以使用以下方法:

DataL : [[1, 2], [2, 4], [3, 6], [4, 8]];  /* Using your example list */
DataM : apply('matrix, DataL);              /* and matrix             */

DataML : makelist(list_matrix_entries(row(DataM, i)), i, 1, 4);
is(DataML = DataL);   /*  true  */

这段描述比较拗口,可能效率也不高。在Maxima中使用底层的Lisp结构(类似于我更熟悉的Mathematica),你可以使用part来检查DataLDataM的头部。请注意保留HTML标签,但不要添加解释。
part(DataL, 0);  /*  [       */
part(DataM, 0);  /*  matrix  */

然后要在这两种结构之间进行转换,您可以使用substpart
is(substpart(matrix, DataL, 0) = DataM);   /*  true  */
is(substpart( "[",   DataM, 0) = DataL);   /*  true  */

在级别为0使用substpart与使用apply几乎相同,除了它适用于更多的内容,而不仅仅是列表。


谢谢@Simon。你的解决方案非常好用。我一直在阅读文档,但没有成功。由于我使用最小二乘法和其他几种操作不同类型的方法(有些限制于矩阵,而其他则操作列表),所以双向转换是很大的帮助。 - Grzegorz Wierzowiecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接