【发布时间】:2015-08-25 21:33:18
【问题描述】:
我有一个函数A(k),当我输入例如A(1) 时,它会返回一个依赖于k 的矩阵。我想自动创建矩阵:
[A(3)*A(2)*A(1) A(3)*A(2) A(3)]
在 Mathematica 中我可以这样做:
Table[Apply[Dot,Table[A(k),{k,3,i,-1}]],{i,1,3}]
假设 A(k) 是一个返回 3x3 矩阵的函数。例如输入A(1) 可能会返回:
[1,2,3;4,5,6;7,8,9]
Mathematica 代码说明:Table[A(k),{k,3,i,-1}] 是从 k=3 到 k=i 的“循环”,每次迭代将 k 递减 -1。因此输出将是 list {A(3),A(2),...,A(i)}... 显然 k 从 3 开始,然后对于 i=2,输出列表将是 {A(3),A(2)}。函数Apply[Dot,Table[A(k),{k,3,i,-1}]] 将列表的元素相乘。对于 i=2,这将产生 A(3)*A(2)。最后,Table[Apply[Dot,Table[A(k),{k,3,i,-1}]],{i,1,3}] 应用与第一条语句相同的逻辑,将i 从 1 循环到 3。因为内表依赖于 i,这将创建元素列表 {A(3)*A(2)*A(1),A(3)*A(2),A(3)}。列表是 Mathematica 的矩阵版本。
如何在 MATLAB 中实现相同的效果,即不使用 for 循环来实现结果?谢谢!
【问题讨论】:
-
我可以假设你的数组的大小是 3 吗?在你的例子中不是很清楚。我也看不到参数 1 对预期输出的影响。你能再举几个例子说明你追求的是什么吗?
-
A(k)的大小为 10x10。但我想这对于不同大小的数组的适用性并不重要。 -
您为什么不想要使用循环?...特别是因为您可以缓存早期的乘法并在以后的迭代中使用它?
-
这不是代码高尔夫。我个人认为
for循环更适合您的目的。单行(对我来说)将需要几个arrayfun/cellfun调用和cell2mat调用来将所有内容转换回来。for循环具有更高的可读性,并且肯定会更快....不过,这是我的两分钱。 -
现在有了解释,我同意 rayryeng。 for 循环可能是解决这个问题的最有效方法。
标签: matlab loops for-loop functional-programming