2013-11-01 23 views
7

Çok uzun bir vektör 1xr v ve çok uzun bir vektör w 1xs ve bir A rxs matrisine sahibiz (ancak boyut olarak çok büyük).Matlab aşağıdakileri optimize etmez mi?

Ben Matlab tarafından optimize edilmesi için aşağıdaki yüzden bellek ile derde olmaz bekliyordum: Ben çünkü Matlab aslında tam v'*w matris oluşturmak için çalışıyor gibi

A./(v'*w) 

ama öyle görünüyor bellek sorunu dışında çalışan. Bunu aşmanın bir yolu var mı? Tüm v'*w değerini hesaplamaya gerek olmadığını unutmayın, çünkü A'un birçok değeri 0'dur.

DÜZENLEME: Bu mümkün olsaydı, tek yolu A(find(A))./(v'*w)(find(A));

yapmak olacaktır yapmak ama ilk hesaplanması ve içinde koymadan bir matris (bu durumda v'*w) bir alt kümesini seçemezsiniz bir değişken.

+1

[ 'spfun'] (http://www.mathworks.com/help/matlab/ref/spfun.html) - "sıfırdan farklı seyrek matris elemanlarına işlevini uygula" –

+0

mmm ... spfun iyi bir lider olabilir, ancak bu durumda nasıl kullanılacağını bilmiyorum. İlk olarak, değerlendirilen işlev, uygulandığı matris hücresinin dizininden habersizdir. – kloop

cevap

6
  • bsxfun. Bu matrisi v.'*w oluşturmadan A./(v'*w) aynı sonucu verir:

    bsxfun(@rdivide, bsxfun(@rdivide, A, v'), w) 
    
  • başka olasılık: Yalnızca, kullanım sıfırdan farklı değerleri istiyorsanız:

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

    Bu A(find(A))./(v'*w)(find(A)) karşılık gelen bir sütun vektörü verir yine v.'*w üretmeden. A./(v'*w) seyrek matrisine ihtiyacınız varsa (bunun yerine sıfır olmayan değerlerin sütun vektörü), sparse(ii,jj,Anz./v(ii)'./w(jj).') kullanın.

Muhtemelen yerine kullanmak istediğiniz
+0

Başka bir “rdivide” cevabı! Çok hoş. Ancak sıfır olmayan bir çözüm, bellek sorunları nedeniyle gerekli olabilir, ancak daha sonra gördüğümü ele almak için terimleri yeniden düzenlediniz. – chappjc

+0

@chappjc Evet, bsxfun hakkında öğrendiğimden beri bunu her şeye uygulamak eğilimindeyim :-) –

+0

kloop '(v' * w) 'terimini yeniden düzenlemeyle ilgili noktanızı alamıyorum, ancak siz onları sırayla. Sadece ilk bakışta anlamadığım problemin doğası. Sonuç olarak, cevap aslında sadece denedim bir test durumunda '5.8208e-11' tarafından referanstan farklıdır ... makine birikimi hata birikimi, ancak hala küçücük. – chappjc