【发布时间】:2014-11-10 07:18:55
【问题描述】:
给定,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];
【问题讨论】:
-
请同时发布您的代码目标的解释,而不是仅仅发布代码并期望人们解释它
-
U,V,R的示例以及您的期望。 -
我正在尝试实现电影收视率的矩阵分解。 R 是包含在 .mat 文件中的电影评分数组,其值为 1-5。 U 和 V 是随机值数组。
-
你在那里有数据依赖,所以即使不是不可能也不容易。我会保持它现在的样子。
标签: matlab matrix vectorization