你将如何从这个matlab代码中删除循环

use*_*712 2 matlab vectorization

鉴于我们有:

  • x是2d矩阵,大小为[numSamples x numFeatures]
  • A是2d方形矩阵,大小为[numFeatures x numFeatures]
  • B是1d向量,大小为[1 x numFeatures]

我想在没有循环的情况下评估以下代码:(或以更快的方式)

out = zeros(1,numSamples);
for i = 1:numSamples
    res = sum(repmat(B - x(i,:), numSamples, 1)*A.*(x - repmat(x(i,:), numSamples, 1)), 2).^2;
    out(i) = var(res);
end
Run Code Online (Sandbox Code Playgroud)

如果您对更快地改进上述内容有其他建议,那也非常受欢迎.

Div*_*kar 7

您可以bsxfun片逐片进行矢量化解决方案-

P1 = bsxfun(@minus,B,x)*A;
P2 = bsxfun(@minus,x,permute(x,[3 2 1]));
out = var(squeeze(sum(bsxfun(@times,P1,P2),2)).^2.');
Run Code Online (Sandbox Code Playgroud)

部分矢量化方法 -

P = (bsxfun(@minus,B,x)*A).';  %//'
out = zeros(1,numSamples);
for i = 1:numSamples
    out(i) = var((bsxfun(@minus,x,x(i,:))*P(:,i)).^2);
end
Run Code Online (Sandbox Code Playgroud)

  • @ user2324712该死的,我看到有些怀疑!;) (2认同)
  • @ user2324712`bsxfun`喜欢`cake`又名`memory`,所以要好好吃;)要小心,因为有了大量的数据,内存传输,而不是实际的计算可能会减慢速度.但是,所有这些都将取决于GPU和相关硬件. (2认同)