簡體   English   中英

如何在Matlab中進行以下計算?

[英]How to do the following calculation in Matlab?

我有以下類似的問題: Matlab是否無法優化以下內容?

但這是一個較難的變體,因此建議的解決方案不起作用。

我有一個很長的矩陣nxr V,一個很長的矩陣W nxs,還有一個矩陣A rxs,它是稀疏的(但是尺寸很大)。

我期望通過Matlab對以下內容進行優化,以免出現內存問題:

A./(V'*W)

但是似乎Matlab實際上正在嘗試生成完整的V'* W矩陣,因為我遇到了內存不足的問題。 有辦法克服嗎? 請注意,由於A的許多值為0,因此無需計算所有V'* W。

如果可能的話,一種方法是做A(find(A))./(V'* W)(find(A));

但是您必須先計算矩陣並將其放入變量中,然后才能選擇矩陣的子集(在這種情況下為V'* W)。

(與上一個問題的主要區別:V和W不僅是向量,而且還是矩陣。)

可以將上一個問題的答案概括為如下計算A./(V'*W)的非零值:

[ii jj Anz] = find(A);
result = arrayfun(@(n) Anz(n) / ( V(:,ii(n))'*W(:,jj(n)) ), 1:length(ii) );

這避免了計算完整的矩陣V'*W ,因為它僅計算一次該矩陣的所需條目(即, A的對應條目為非零的那些條目)。 因此,內存使用率保持在較低水平。 至於速度,使用arrayfun通常很慢,但是如果A非零值很少,則不會花費很長時間。

當然,然后可以將稀疏矩陣A./(V'*W)成為sparse(ii,jj,result)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM