Re: 非常有趣的記憶體問題(bug?)已回收

看板MATLAB作者 (初衷)時間16年前 (2009/07/08 06:59), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
自己都忘了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)
文章代碼(AID): #1AKzDXJA (MATLAB)
文章代碼(AID): #1AKzDXJA (MATLAB)