2013-07-15 73 views
0

我乘以兩個矩陣A(大小nxn)和B(大小nxm)。在matlab中最簡單的方法將是如何在matlab中的arrayfun中傳遞一個數組作爲參數?

n = 1000; 
m = 500; 
for k=1:n 
    A(k, :) = (1:n)+k; 
end 
B = rand(n, m); 
C = A*B; % C of the size nxm 

然而,當n和/或m太大時,這段代碼佔用太多的內存。所以我正在尋找矢量化版本的陣列來實現,

n = 1000; 
m = 500; 
B = rand(n, m); 
func0 = @(k, colv) [(1:n)+k]*colv; 
func1 = @(V) arrayfun(func0, 1:n, V); 
func1(B) 

但它不起作用。它說維度不匹配。任何人有任何建議?

+0

你能再解釋一下爲什麼你會發現'C = A * B'不足嗎? –

回答

1

我不會爲此使用任何東西,只是打破正在執行的線性代數。

C = zeros(n,m); 
for k = 1:n 
    C(k,:) = ((1:n)+k) * B; 
end 

或者稍微冗長

C = zeros(n,m); 
for k = 1:n 
    A_singleRow = ((1:n)+k); 
    C(k,:) = A_singleRow* B; 
end 

對於瘋狂的大尺寸(這聽起來像你有),請重新定義的問題,這樣就可以在列迭代,而不是行。 (Matlab使用列 - 主矩陣存儲,這意味着同一列中的元素在內存中相鄰,通常對此過分關注可能會陷入過度優化的境地,但可能不適合您)。

例如,您可以構建Ctranspose如下:

Ctranspose = zeros(m,n); %Note reversed order of n, m 
Btranspose = B';   %Of course you may want to just create Btranspose first 
for k = 1:n 
    A_singleRowAsColumn = ((1:n)'+k); 
    Ctranspose(:,k) = Btranspose * A_singleRowAsColumn; 
end 

的工具arrayfuncellfun是功能化for循環,這可以用來使代碼更清晰非常有用的。但是,在試圖壓縮性能時,它們通常沒有用處。即使匿名函數/ arrayfun實現被調試,我懷疑它會需要大致相同的內存使用情況。

+0

你是對的,性能真的不如直接在matlab中使用矩陣乘法那麼快。但使用的內存少於原始情況。在我的代碼中,矩陣非常大(使用超過30GB甚至更多),您的代碼或arrayfun將節省1/3內存。但爲了提高效率,使用循環不如arrayfun快(儘管不易理解)。我的代碼模擬一個大矩陣,它總共使用100GB並運行超過500小時,它太大而且太慢而無法直接進行矩陣乘法運算,所以我需要交替方案 – user1285419

+0

這實在太瘋狂了。我添加了另一個嘗試,與Matlab中列主要排序相關。另外,確保你確實符合你的物理記憶。運行'[〜,x] = memory',並確保'x.PhysicalMemory.Available'很舒服。 – Pursuit

+0

謝謝。是的,它符合我的記憶。代碼在集羣中運行時擁有大容量內存,但只有部分內存分配給每個用戶和任務,因此我正在尋找一種平衡內存和性能的方法。 – user1285419

相關問題