2016-09-27 159 views
0

的有效方法我有浮點類型的兩個矩陣:
A其尺寸7000x100000和
B其尺寸100000x20。
當我把它們相乘時,即使輸出很小,我的代碼也會消耗我的整個RAM。
有沒有辦法讓這個更高效的內存?我試過this from Matlab help page,但它沒有幫助。相乘兩個非稀疏矩陣

+0

矩陣是否具有相同的數字類型?也許如果'A'是一個整數類型,但是'B'是一個浮點類型,那麼'A'會有一些隱式轉換爲浮點運算 - 這會佔用比預期更多的內存。我有點困惑你的矩陣是否稀疏。標籤說'稀疏矩陣',但標題說非稀疏。 – jez

+0

兩者都是浮動的。對不起,我應該提到 – iLoveCamelCase

+0

你可以在乘以它們之前在內存中同時存儲矩陣A和B嗎?只有當你試圖繁殖時,你纔會「脫離內存」嗎? – Shai

回答

0

你可以試試,分成塊:

截至A行:

row_blk = 1000; 
C = zeros(size(A,1), size(B,2), class(A)); 
f = 1; t = row_blk; 
while t <= size(A,1) 
    C(f:t,:) = A(f,t,:)*B; 
    f = t+1; 
    t = min(size(A,1), f+row_blk-1); 
end 

截至A列:

col_blk = 10000; 
C = zeros(size(A,1), size(B,2), class(A)); 
f = 1; t = col_blk; 
while t <= size(A,2) 
    C = C + A(:,f:t)*B(f:t,:); 
    f = t+1; 
    t = min(size(A,2), f+col_blk-1); 
end 
0

我運行在GNU驗證碼此代碼的八度和內存消費:

a= rand(7000,100000); 
b = rand(100000,20); 

是:

Absolute running time: 10.05 sec, cpu time: 9.97 sec, memory peak: 5375 Mb 

這個代碼的內存消耗:

a= rand(7000,100000); 
b = rand(100000,20); 
c = a * b; 

是:所以沒有顯著差異觀察

Absolute running time: 14.26 sec, cpu time: 14.19 sec, memory peak: 5376 Mb 

+0

即使創建矩陣佔用我的RAM – iLoveCamelCase

+0

@iLoveCamelCase正如在其他回答指出,使用循環,你可以創建部分矩陣,乘以它們,保存結果,然後繼續與矩陣的其餘部分 – rahnema1

+0

我使用32位版本的八度。無法創建矩陣a(7000,100000)。錯誤是 - 「錯誤:內存不足或維度對於Octave索引類型來說太大」。所以要使用這種矩陣,你需要64位版本的Matlab/Octave。你的八度64位? – SergV