2013-11-01 26 views
7

我有一個非常長的矢量1xr v,和一個非常長的矢量w 1xs,和一個矩陣A rxs,這是稀疏(但非常大的尺寸)。Matlab不會優化以下內容嗎?

我期待下面通過Matlab的優化,所以我不會有記憶遇到麻煩:

A./(v'*w) 

,但它似乎像Matlab實際上是試圖以生成完整的v'*w矩陣,因爲我遇到內存不足問題。有沒有辦法解決這個問題?請注意,沒有必要計算所有v'*w,因爲A的許多值是0

編輯:如果這是可能的,一個辦法做到這一點是做A(find(A))./(v'*w)(find(A));

,但你不能沒有首先計算它,並把它在選擇一個矩陣(v'*w在這種情況下)的一個子集一個變量。

+1

你可能想改用['spfun'(http://www.mathworks.com/help/matlab/ref/spfun.html) - 「應用功能非零稀疏矩陣元素」 –

+0

嗯...... spfun可能是一個很好的領先者,但我不確定如何在這種情況下使用它。首先,所評估的功能不知道其所應用的矩陣單元的索引。 – kloop

回答

6
  • 您可以使用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).')

+0

另一個'rdivide'回答!非常好。但是由於內存問題,可能需要非零解決方案,但是您又重新安排瞭解決這些問題的術語。 – chappjc

+0

@chappjc是的,因爲我瞭解了'bsxfun',我傾向於將它應用於一切:-)我不明白你的意思,重新排列術語 –

+0

kloop有'(v'* w)'分組,但你可以處理他們順序。乍一看,這只是我沒有掌握的問題的本質。結果,答案實際上與'5.8208e-11'在一個測試案例中的參考不同,我剛剛嘗試了...機器精度錯誤累積,但仍然很小。 – chappjc