Matlab:通过循环索引而不使用For循环来制作矩阵?

时间:2015-08-25 21:33:18

标签: matlab loops for-loop functional-programming

我有一个函数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循环来实现结果?谢谢!

3 个答案:

答案 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));