1

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

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

谢谢!

4

2 回答 2

4

您可以使用单元格数组

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

调用第jth 矩阵就很简单了

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

或者像这样的 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 阵列似乎是最好的方法。

于 2013-05-28T12:52:39.423 回答
1

Rody Oldenhuis在他的答案中给出了三个很好的存储矩阵的替代方案(我已经赞成)。我只是想改进三个中最慢的一个。

MATLAB 矩阵按列而不是按行索引速度更快,因此我正在构建一个大的宽矩阵(2×2*n)而不是一个高矩阵(2*n×2)。还可以简化在迭代中构建索引。

这是结果,使用稍微方便的基准测试(您将需要来自 File Exchange的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“切片”方法一样快(甚至稍微快一点,但差异真的可以忽略不计)

于 2013-05-28T23:30:18.517 回答