如何在matlab中对表达式进行矢量化

时间:2013-09-13 07:53:05

标签: matlab vectorization

我无法对此进行矢量化:

for x=2:i
   for y=2:j
     if(x ~= y)
       Savings(x,y) = Costs(x,1) + Costs(1,y) - Costs(x,y);
     end
   end
end

有人可以告诉我,我可以提高此代码的性能吗?感谢

2 个答案:

答案 0 :(得分:0)

你可以像这样对它进行矢量化,但我不知道这是否会影响你的表现。你需要亲自测试一下。

m=size(Costs, 1);
n=size(Costs, 2);

[Y, X] = meshgrid(2:m, 2:n);

Cx = Costs(:,1);
Cy = Costs(1,:);

S = Cx(X) + Cy(Y) - Costs(2:end,2:end);

S(eye(m-1,n-1)==1) = 0;
Savings = zeros(m,n);
Savings(2:end,2:end) = S;

修改

顺便提一下,我已经确认所有三种方法都给出了相同的答案。如果Costs大小为400x400,则运行时间如下:

Elapsed time is 0.00741386 seconds. //My method
Elapsed time is 0.003304 seconds.   //Mohsen's method (after correcting to prevent errors)
Elapsed time is 2.16231 seconds.    //Original Loop

因此,我们的方法都有显着提升。但是,如果您只是预先分配Savings,那么您的循环实际上是最快的。这对你的目的来说真的太慢吗?

答案 1 :(得分:0)

bsxfun的帮助下:

Ix=2:i; 
Iy=2:j;
I = false(i,j);
I(Ix,Iy) = bsxfun(@ne, Ix', Iy);
S = bsxfun(@plus, Costs(Ix,1), Costs(1,Iy)) - Costs(Ix,Iy);
Savings(I) = S(I(Ix,Iy));