Matlab:有效存储n个2x2矩阵

时间:2013-05-28 12:49:01

标签: matlab recursion storage iteration

我有一个递归过程,每次循环迭代时都会生成一个2x2矩阵。我希望以后能够调用这些矩阵,但我不确定如何有效地将它们存储在一起。

如果程序迭代了n次,我应该将它们存储在2nx2矩阵中吗?但是接下来我将如何调用这个长矩阵中的第j个矩阵(第2j-1行和第2j行)?

谢谢!

2 个答案:

答案 0 :(得分: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}

(注意花括号)。

您也可以将它存储在一个大型2D阵列中(如您所建议的那样),

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,:) 

或像这样的3D数组,

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阵列是最好的方式。

答案 1 :(得分:1)

Rody Oldenhuis提供了三个很好的选择来将矩阵存储在他的答案中(我已经投票)。我只想改善三者中最慢的一个。

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