【问题标题】:Vectorization Octave矢量化八度
【发布时间】:2020-04-23 19:51:48
【问题描述】:

我在 Octave 中处理一些基本的矢量化操作。

假设我实例化了一个 10*10 矩阵 A。 A = magic(10) 我还实例化了一个向量 x。 x = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

我想使用向量化操作,而不是 for 循环来填充空向量 e。 e = zeros(10,1)

for i = 1:10
  for j = 1:10
    v(i) = v(i) + A(i, j) * x(j);
  end
end

我研究了有关矢量化的 octave 文档第 19 章,我相信唯一的答案是 v = A * x。但我不确定是否存在其他选项来矢量化这个循环。

【问题讨论】:

  • v = A * x 有什么问题?看起来是一个完美的解决方案。
  • 当然,但我是对的,这将是唯一的解决方案?根据 octave 文档,它会是。
  • 还有sum(A.*x.', 2),它使用元素乘法与broadcasting。但是矩阵乘法可能会快一点,而且看起来更干净

标签: matlab loops vectorization octave


【解决方案1】:

使用乘法是最好的选择,但还有其他选择,例如:

sum(A.*x.',2)

当涉及到矢量化循环时,您经常会找到这样的解决方案,例如:

for i = 1:10
  for j = 1:10
    v(i) = v(i) + f(i,j);
  end
end

中间步骤是一个矩阵,其中包含 f(i,j) 的所有解(在您的示例中为 sum(A.*x.',2)),然后您累积将 + 替换为 sum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2018-05-16
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多