Matlab:n2x2矩阵的高效存储

Matlab:n2x2矩阵的高效存储,matlab,recursion,storage,iteration,Matlab,Recursion,Storage,Iteration,我有一个递归过程,每次循环迭代时生成一个2x2矩阵。我希望以后能够调用这些矩阵中的每一个,但我不确定如何有效地将它们存储在一起 如果过程迭代n次,我应该将它们存储在2nx2矩阵中吗?但是我如何调用这个长矩阵中的第j个矩阵行2j-1和2j呢 谢谢 您可以使用: 那么,调用第j个矩阵就很简单了 matrix_j = matrices{j} 注意花括号 您也可以按照建议将其存储在大型2D阵列中 matrices = zeros(2*n,2); for ii = 1:n % generate

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

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

谢谢

您可以使用:

那么,调用第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,:) 
matrix_j = matrices(:,:,j);
或者在这样的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(2*(j-1)+[0 1]+1,:) 
matrix_j = matrices(:,:,j);
比较n=1e5的方法:

您可能想在自己的计算机上测试这些东西,但大型3D阵列似乎是最好的方法

您可以使用:

那么,调用第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,:) 
matrix_j = matrices(:,:,j);
或者在这样的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(2*(j-1)+[0 1]+1,:) 
matrix_j = matrices(:,:,j);
比较n=1e5的方法:

您可能想在自己的计算机上测试这些东西,但大型3D阵列似乎是最好的方法

在他的答案中给出了三个很好的替代方法来存储矩阵,我已经投了赞成票。我只是想在三个中最慢的一个基础上提高

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

结果是,使用稍微方便一点的基准测试,您将需要来自文件交换的函数

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
现在,宽2D矩阵的速度与3D切片法一样快,甚至稍微快一点,但差异实际上可以忽略不计。

给出了三个很好的替代方案来存储他的答案中的矩阵,我已经投了赞成票。我只是想在三个中最慢的一个基础上提高

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

结果是,使用稍微方便一点的基准测试,您将需要来自文件交换的函数

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

现在,宽2D矩阵的速度与3D切片方法的速度一样快,甚至稍微快一点,但差异实际上可以忽略不计

注意,与在2 x 2 x n 3D矩阵中存储n 2 x 2矩阵相比,此单元方法的内存消耗大约高出4倍。另一方面,单元法似乎比将二维矩阵存储在2x2xn矩阵中快得多。@H.Muster:的确如此。这总是让我感到奇怪;单元格应该只是指向数据指针的容器,对吗?但这并不是-完全是-正在发生的事情…无论如何,为了完整性,我将编辑它。很好的答案+1。我有点困惑,细胞代码和2xn阵列代码的运行时间对您来说没有区别。在我的系统中,后者要慢得多。@H.Muster:我知道,我有一个APU,到目前为止,它一直给我的结果与这里的大多数人不兼容……在这种情况下,我没有抱怨,但它不是很容易复制。也许你可以编辑你的结果并相应地改变结论?+1我发布了一个稍微修改过的基准测试,第二种方法的代码有所改进。但是,请注意,与在2 x 2 x n 3D矩阵中存储n 2 x 2矩阵相比,这种单元方法的内存消耗大约高出4倍。另一方面,单元法似乎比将二维矩阵存储在2x2xn矩阵中快得多。@H.Muster:的确如此。这总是让我感到奇怪;单元格应该只是指向数据指针的容器,对吗?但这并不是-完全是-正在发生的事情…无论如何,为了完整性,我将编辑它。很好的答案+1。我有点困惑,细胞代码和2xn阵列代码的运行时间对您来说没有区别。在我的系统中,后者要慢得多。@H.Muster:我知道,我有一个APU,到目前为止,它一直给我的结果与这里的大多数人不兼容……在这种情况下,我没有抱怨,但它不是很容易复制。也许你可以编辑你的结果,并相应地改变结论?+1我发布了一个稍微修改的基准,第二种方法的代码得到了改进。