用于逻辑运算的矩阵矢量化

时间:2014-11-10 07:18:55

标签: matlab matrix vectorization

给定,l和r是两个常量和数组,其维度类似于:

U:n1 x 1

V:1 x n2

R:n1 x n2

for i = 1:n1
    for j = 1:n2
        if R(i, j) > 0
            eij = R(i, j) - U(i, :).*V(:, j);
            U(i,:) = U(i,:) + l*(2*eij*V(:,j) - r*U(i,:));
            V(:,j) = V(:,j) + l*(2*eij*U(i,:) - r*V(:,j));
        end
    end
end

如何对此代码进行矢量化?我试过了:

E = bsxfun(@minus, R, U*V);
E(E<0) =0;
U(1:n1,:) = U(1:n1,:) + l*(2*E(1:n1, 1:n2)*V(:,1:n2)' - r*U(1:n1,:));
V(:,1:n2) = V(:,1:n2) + l*(2*U(1:n1,:)'*E(1:n1, 1:n2) - r*V(:,1:n2));

但这并没有给我相同的答案,因为n1和n2太大,运行for循环需要花费太多时间。

请帮忙。谢谢!

编辑: U = [0.3; 0.1; 0.15; 0.05; 0.2];

V = [0.35 0.45 0.15 0.05];

R = [5 3 0 1; 4 0 0 1; 1 1 0 5; 1 0 0 4; 0 1 5 4];

1 个答案:

答案 0 :(得分:0)

您未提供的一些信息:

您是否希望R的值<= 0(稍后的步骤等)?

这部分U(i, :).*V(:, j)似乎不正确:您打算将元素两个向量相乘并使用.*,但问题是您提供的向量是1长度!所以它没用。你确定要这个吗?

无论如何,我可以推断出以下内容,以便对您的计算进行矢量化:

Rold = R;
I = R <= 0;
R = R - U*V;
R(I) = Rold(I);

这种方法当然会使用大量内存,因为它会分配R两次。