我有一个函数A(k)
,当我输入例如k
时,它返回一个依赖于A(1)
的矩阵。我想自动创建矩阵:
[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。因此输出将是列表 {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循环来实现结果?谢谢!
答案 0 :(得分:2)
对于记录,这是一个循环版本,主要用于后续的时序检查。这不是你想要的答案,而是你需要的答案;)
N = 10; %size of A
old = eye(N);
M2 = [];
for i=3:-1:1
new = old*A(i);
M2 = [new M2];
old = new;
end
或者如果你想真正有效(可能不是这样):
N = 10; %size of A
M2 = A(3);
old = M2;
for i=2:-1:1
new = old*A(i);
M2 = [new M2];
old = new;
end
答案 1 :(得分:2)
This answer基本上是问题的解决方案,但正如我们正在讨论的有效使用matlab我想在这里留下我的想法如何使用Matlab高效。代替大型2D矩阵,创建3D-Matrix(每个乘法的结果都堆叠在一起)要简单得多。如果3D矩阵是可接受的,请按原样使用代码,否则在最后一行注释以获得2D矩阵。
M3=[];
n=3;
M3(:,:,n) = A(n);
for ix=n-1:-1:1
M3(:,:,ix) = M3(:,:,ix+1)*A(i);
end
%M3=reshape(M3,size(M3,1),[]);
答案 2 :(得分:0)
您可以将arrayfun()
与索引一起用作参数,例如:
%// Compute the product A(3)*A(2)*...*A(idx)
F = @(idx) prod(reshape(cell2mat(arrayfun(A,3:-1:idx, 'UniformOutput', false)),10,10,4-idx),3);
%// Use the last function with idx=1:3
M = cell2mat(arrayfun(F,1:3, 'UniformOutput', false));