2013-05-28 122 views
1

我有一個遞歸過程,每次循環迭代時都會生成一個2x2矩陣。我希望能夠在稍後調用這些矩陣中的每一個,但我不確定如何有效地將它們全部存儲在一起。Matlab:n個2x2矩陣的高效存儲

如果該過程迭代n次,我應該將它們存儲在2nx2矩陣中嗎?但是,那麼我怎麼會要求在這個長矩陣內說第j個矩陣(第2j-1和2j行)呢?

謝謝!

回答

4

您可以使用cell arrays

matrices = cell(n,1); 
for ii = 1:n 

    % generate your matrix 
    matrix_ii = rand(2); 

    % store it for later 
    matrices{ii} = matrix_ii; 

    % [do your stuff] 

end 

回顧j個矩陣是如此的簡單

matrix_j = matrices{j} 

(注意大括號)。

你也可以將其存儲在一個大的二維數組(如你所說),

matrices = zeros(2*n,2); 
for ii = 1:n 

    % generate your 2x2 matrix 
    matrix_ii = rand(2); 

    % store it for later 
    matrices(2*(ii-1)+[0 1]+1,:) = matrix_ii; 

    % [do your stuff] 

end 

回顧值後,像這樣:

matrix_j = matrices(2*(j-1)+[0 1]+1,:) 

或三維陣列,像這樣,

matrices = zeros(2,2,n); 
for ii = 1:n 

    % generate your 2x2 matrix 
    matrix_ii = rand(2); 

    % store it for later 
    matrices(:,:,ii) = matrix_ii; 

    % [do your stuff] 

end 

以後調用值如下:

matrix_j = matrices(:,:,j); 

比較方法n = 1e5

Elapsed time is 0.282959 seconds. % cell arrays 
Elapsed time is 0.856801 seconds. % 2*n x 2 matrix 
Elapsed time is 0.293186 seconds. % 2x2xn array 

Memory: 9200000 bytes % Cell arrays 
Memory: 3200000 bytes % 2*n x 2 matrix 
Memory: 3200000 bytes % 2x2xn array 

你可能想測試自己的計算機上這些東西,但它出現在大型3D陣列是去這裏最好的方式。

+3

但是,請注意,內存消耗這種單元方法比在'2×2×n'3D矩陣中存儲'n''2×2'矩陣大4倍。另一方面,細胞方法似乎比在2×2×n矩陣中存儲二維矩陣要快得多。 –

+0

@ H.Muster:確實。這一直讓我感到奇怪;細胞「應該」不過是指向數據的容器,對吧?但那並不是 - 很快 - 發生了什麼......無論如何,我會爲了完整而編輯它。 –

+0

很好的答案(+1)。我有點困惑,單元代碼和2x2xn數組代碼所用的時間對你來說並沒有什麼不同。在我的系統中,後者要慢得多。 –

1

Rody Oldenhuis給出了三個很好的選擇來存儲他的答案矩陣(我已經upvoted)。我只是想改善三者中最慢的一個。我建立了一個大的寬矩陣(2×2 * n),而不是一個高矩陣(2×n×2)。MATLAB矩陣是按列而不是按行索引的,所以我構建了一個大的寬矩陣(2×2×n)而不是一個高矩陣(2×n×2)。在迭代中構建索引也可以簡化。

這裏是一個結果,一個稍微更方便的基準(你將需要TIMEIT功能從文件交換)

function [t,b] = test_2d_matrices_container() 
    N = 1e5; 
    f = {@()func_cell(N), @()func_wide_2d_mat(N), @()func_3d_mat(N)}; 

    t = cellfun(@timeit, f); 
    b = cellfun(@get_mem, f); 
end 

function b = get_mem(f) 
    x = feval(f); %#ok<NASGU> 
    S = whos('x'); 
    b = S.bytes; 
end 

function M = func_cell(N) 
    M = cell(N,1); 
    for i=1:N 
     M{i} = rand(2); 
    end 
end 

function M = func_wide_2d_mat(N) 
    M = zeros(2,2*N); 
    for i=1:2:2*N 
     M(:,[i i+1]) = rand(2); 
    end 
end 

function M = func_3d_mat(N) 
    M = zeros(2,2,N); 
    for i=1:N 
     M(:,:,i) = rand(2); 
    end 
end 

結果我得到我的機器上:

>> [t,b] = test_2d_matrices_container 
t = 
     0.13963  0.22997  0.23434 
b = 
    9200000  3200000  3200000 

現在,「寬」2D矩陣的情況與3D「切片」方法一樣快(甚至更快,但差別實際上可以忽略不計)