2013-05-28 80 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“切片”方法一样快(甚至更快,但差别实际上可以忽略不计)