Re: [問題] MATLAB對於大型反矩陣及大型矩陣的運算

看板MATLAB作者 (prof)時間12年前 (2013/04/29 22:15), 編輯推噓4(4014)
留言18則, 3人參與, 最新討論串3/3 (看更多)
※ 引述《jamesweb3 (James)》之銘言: : 這個問題困擾我很久了~ : 由於實驗的需要,我必須操作大型的矩陣 : 其中以下2個步驟相當緩慢,不知道有沒有人可以幫我解決:( : 1.我的矩陣(A)約要40000*4000這麼大,建造方式是每一個row都是相同的值 : 而這個值就是某個已經建好的vector(B)決定,因此我想到用"迴圈" : for i = 1:S : rowsum_m(i,1:1:4000) = rowsum(i); : end : 結果,迴圈在MATLAB相當慢!!!有沒有好的解決方式? rowsum_m = rowsum(ones(40000,1),:); : 2.其中一個步驟需要算反矩陣(temp),導致結果非常非常慢~不知道有什麼問題 : 這個矩陣的大小在40000*40000左右 : 我要計算的是: p1 = (1-alpha)*(1-beta)*(temp\Wuo); 你在matlab裡面就已經是這樣打的嗎? 還是你打的是inv(temp)*Wuo? 兩者速度有差 一個是用LU 一個是真的去求反矩陣 但這種反矩陣的問題其實真的沒什麼辦法了...除非你是帶狀 但你應該顯然不是= = : 所以,需要有inv(temp), 我不知道怎麼樣可以快一點 : 一次大多許一小時以上 : ========================= : 煩請知道的朋友告訴我 : 我會感激不盡!! : 謝謝 -- 正妹也只不過是一組物質波方程的特解罷了(  ̄ c ̄)y▂ξ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.247.141

04/29 22:18, , 1F
其實我要inv(temp)*Wuo, 參考過好像\比較適合
04/29 22:18, 1F

04/29 22:18, , 2F
但是仍然很慢......
04/29 22:18, 2F

04/29 22:51, , 3F
恩...反矩陣除非你矩陣形式特殊 不然真的無法
04/29 22:51, 3F

04/29 23:01, , 4F
那~我可以用matlab平行運算嗎?
04/29 23:01, 4F

04/29 23:02, , 5F
可是,我很怕ram會爆掉~ 現在跑一個run有時接近100% ram
04/29 23:02, 5F

04/29 23:31, , 6F
這我就不清楚了@@沒用過
04/29 23:31, 6F

04/29 23:35, , 7F
如果你有可以支援cuda的卡的話可以下載gpumat來平行
04/29 23:35, 7F

04/29 23:35, , 8F
理論上的平行效率會比matlab內建的還要好,不過有時候用gpu
04/29 23:35, 8F

04/29 23:36, , 9F
反而會比用CPU還要慢。如果改用cuda語言的話可以真的快很多
04/29 23:36, 9F

04/29 23:36, , 10F
缺點是程式要在自己寫...
04/29 23:36, 10F

04/29 23:40, , 11F
不過不過你的矩陣這麼大GPU的記憶體應該裝不下會比麻煩
04/29 23:40, 11F

04/30 00:10, , 12F
阿不好意思 第一題我有點看錯你的意思 應該改成這樣:
04/30 00:10, 12F

04/30 00:12, , 13F
rowsum_m(:,1:4000) = rowsum(:,ones(4000));
04/30 00:12, 13F

04/30 00:12, , 14F
雖然上面板友說的repmat應該是比較general的作法 但是以
04/30 00:12, 14F

04/30 00:13, , 15F
你這邊二維矩陣的情況來說我這樣會稍快一點
04/30 00:13, 15F

04/30 00:13, , 16F
又打錯= = ones(1,4000)
04/30 00:13, 16F

04/30 15:31, , 17F
謝謝你的回答:)
04/30 15:31, 17F

05/01 14:34, , 18F
可以問說,用cuda的畫記憶體問題怎麼解決嗎?
05/01 14:34, 18F
文章代碼(AID): #1HVe1p3q (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1HVe1p3q (MATLAB)