Re: 非常有趣的記憶體問題(bug?)已回收
自己都忘了po過這篇
今天突然想到
(謝謝WC大的回答)
來自問自答一下
以上面這個例子為例
想跑類似下面這行指令
A(n:N,n:N) = A(n:N,n:N) + B(n:N,n:N)
卻發生記憶體不足的情況的話
可以改用
[i j values] = find( A(n:N,n:N) + B(n:N,n:N) ) ;
A = A + sparse(i+n-1, j+n-1, values, N, N);
以避免Matlab在執行時
實體宣告一個(N-n+1)-by-(N-n+1)的矩陣
以上
※ 引述《zznkqb (初衷)》之銘言:
: 發現了一個應該算得上是bug的東西
: (or bad implementation)
: 不知道有沒有人討論過
: 實驗如下:
: N = 某個頗大的數(例如50000)
: n = 某個不是很大的數(譬如10好了)
: A = sparse(N,N)
: B = sparse(N,N)
: 然後執行這行:
: A(n:N,n:N) = A(n:N,n:N) + B(n:N,n:N)
: Matlab會告訴你記憶體不足 (喂~ XD)
: 實際上 n 不需要太小也會有一樣的問題 (譬如N/2)
: 我的猜測是Matlab在實作這部分時
: 不管目標矩陣有多稀疏
: 一律傻傻得new出一塊 (N-n) x (N-n) 的記憶體來做
: 昏倒...
: 通常會用sparse,就是因為真得很稀疏想要節省記憶體使用量阿 XDDD
: 不知道有沒有哪位前輩想到如何解決這個問題??
: 我的想法是
: 先用:
: foo = A(n:N,n:N) + B(n:N,n:N)
: 去接 (試過,這步沒有問題)
: 然後想辦法把 foo 指定(擴張)成為 N x N 那麼大
: 再把foo加回去 (A = A + foo)
: 不過那個"擴張"的動作
: 我一時想不起來可用的指令
: 看有沒有誰能幫忙一下 :P
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 71.231.183.188
※ 編輯: zznkqb 來自: 71.231.183.188 (07/08 07:01)
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章