【问题标题】:Matrix Vectorization for logical operation用于逻辑运算的矩阵向量化
【发布时间】: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


【解决方案1】:

您未提供的一些信息:

你想要R 的值是&lt;= 0(在后面的步骤等中)吗?

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

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

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

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

【讨论】:

  • 对于示例,我使用了一个长度为 1 的向量。
  • 问题是您应该提供矩阵的实际尺寸以获得有效的解决方案
  • 对不起@Eypros。以下是实际尺寸:R:500x1000,U:500x1 和 V:1x1000。但我还必须对 U: 500x3 和 V:3x500 执行相同的计算。
  • 而且我无法更改 R 数组。我正在使用它进行进一步的计算。
  • 如果内存没有问题,您可以将R复制到一个新的矩阵并改变这个。
猜你喜欢
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多