1

我在上述变量上运行上述循环:

  • A 是一个大小为 mxn 的二维数组。
  • mask 是大小为 1xn 的一维逻辑数组
  • 结果是大小为 1xn 的一维数组
  • 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。我希望你能提出一些使用网格网格或那种产生更好性能改进的方法。我不认为我有 RAM 问题,因此解决方案也可能是昂贵的内存。

非常感谢。

4

2 回答 2

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
于 2013-10-29T15:23:54.223 回答
1

试试这个:

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

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

于 2013-10-29T21:39:53.397 回答