Matlab:n2x2矩阵的高效存储
我有一个递归过程,每次循环迭代时生成一个2x2矩阵。我希望以后能够调用这些矩阵中的每一个,但我不确定如何有效地将它们存储在一起 如果过程迭代n次,我应该将它们存储在2nx2矩阵中吗?但是我如何调用这个长矩阵中的第j个矩阵行2j-1和2j呢 谢谢 您可以使用: 那么,调用第j个矩阵就很简单了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
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我发布了一个稍微修改的基准,第二种方法的代码得到了改进。