如何让matlab循环更快地在2d数组上循环

时间:2013-10-29 15:08:47

标签: arrays matlab matrix vectorization

我在上面的变量上运行了上面的循环:

  • A是大小为mxn的二维数组。
  • mask是1d逻辑数组,大小为1xn
  • 结果是大小为1xn的1d数组
  • B是mx1
  • 形式的向量
  • C是mxm矩阵,m与上述相同。

编辑:将foo(x)扩展到函数中。

这是代码:

temp = (B.'*C*B);    
for k = 1:n
    x = A(:,k);
    if(mask(k) == 1)
        result(k) = (B.'*C*x)^2 / (temp*(x.'*C*x)); %returns scalar
    end
end

请注意,我已经成功使用上面的代码作为parfor循环而不是for。我希望你能够建议某种方式使用meshgrid或排序来提高性能。我不认为我有RAM问题所以解决方案也可能是昂贵的记忆。

非常感谢。

2 个答案:

答案 0 :(得分:1)

如果您的foo承认矩阵输入,则可以执行以下操作:

result = zeros(1,n); % preallocate result with zeros
mask = logical(mask); % make mask logical type
result(mask) = foo(A(mask),:); % compute foo for all selected columns

答案 1 :(得分:1)

试试这个:

 result=(B.'*C*A).^2./diag(temp*(A.'*C*A))'.*mask;

通过矩阵乘法进行的矢量化也将确保result是1xn向量。在您提供的代码中,可能会出现mask中的最后一个元素为零的情况,在这种情况下,您的代码会将result截断为较小的长度,而在答案中,它会保留这些元素为零。