【问题标题】:Doesn't Matlab optimize the following?Matlab没有优化以下内容吗?
【发布时间】:2013-11-01 21:03:13
【问题描述】:

我有一个很长的向量 1xr v,和一个很长的向量 w 1xs,还有一个矩阵 A rxs,它是稀疏的(但尺寸很大)。

我希望 Matlab 会优化以下内容,这样我就不会遇到内存问题:

 A./(v'*w)

但似乎 Matlab 实际上正在尝试生成完整的 v'*w 矩阵,因为我遇到了内存不足的问题。有没有办法克服这个问题?请注意,不需要计算所有v'*w,因为A 的许多值都是0

编辑:如果可能的话,一种方法是A(find(A))./(v'*w)(find(A));

但是您不能选择矩阵的子集(在这种情况下为v'*w)而不先计算它并将其放入变量中。

【问题讨论】:

  • 你可能想改用spfun -- "Apply function to nonzero sparse matrix elements"
  • mmm... spfun 可能是一个很好的线索,但我不确定在这种情况下如何使用它。首先,被评估的函数不知道它所应用的矩阵单元的索引。

标签: matlab matrix sparse-matrix


【解决方案1】:
  • 您可以使用bsxfun。这给出了与A./(v'*w) 相同的结果,但不生成矩阵v.'*w

    bsxfun(@rdivide, bsxfun(@rdivide, A, v'), w)
    
  • 另一种可能性:如果您只想要非零值,请使用:

    [ii jj Anz] = find(A);
    Anz./v(ii)'./w(jj).'
    

    这给出了一个对应于您的A(find(A))./(v'*w)(find(A)) 的列向量,同样不会生成v.'*w。如果您需要稀疏矩阵A./(v'*w)(而不是其非零值的列向量),请使用sparse(ii,jj,Anz./v(ii)'./w(jj).')

【讨论】:

  • 另一个rdivide 回答!非常好。但是由于内存问题,可能需要非零解决方案,但是您再次重新排列了术语以解决我看到的问题。
  • @chappjc 是的,因为我了解了bsxfun,所以我倾向于将其应用于所有内容 :-) 我不明白你关于重新安排条款的意思
  • kloop 已将(v'*w) 分组,但您可以按顺序处理它们。这只是我乍一看没有掌握的问题的性质。结果,在我刚刚尝试的测试用例中,答案实际上与5.8208e-11 的参考不同……机器精度误差在累积,但仍然很小。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2020-05-02
  • 2021-09-09
  • 2015-04-12
  • 1970-01-01
相关资源
最近更新 更多