给定,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太大,运行循环需要花费太多时间。
请帮忙。谢谢
编辑: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];
您没有提供的一些信息:
您想要R
的值是<= 0
吗(在后面的步骤中等)?
这部分U(i, :).*V(:, j)
似乎不正确:您打算将两个向量按元素相乘,并使用.*
,但问题是您提供的向量长1!所以没用。你确定你想要这个吗?
无论如何,从你的代码中,我可以推断出以下内容,以便矢量化你的计算:
Rold = R;
I = R <= 0;
R = R - U*V;
R(I) = Rold(I);
这种方法当然会占用大量内存,因为它会两次分配R。