[英]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.