我有一个递归过程,每次循环迭代时都会生成一个 2x2 矩阵。我希望能够在稍后调用这些矩阵中的每一个,但我不确定如何有效地将它们存储在一起。
如果过程迭代 n 次,我应该将它们存储在 2nx2 矩阵中吗?但是,我将如何调用这个长矩阵中的第 j 个矩阵(第 2j-1 和 2j 行)呢?
谢谢!
您可以使用单元格数组:
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
th 矩阵就很简单了
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 阵列似乎是最好的方法。
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“切片”方法一样快(甚至稍微快一点,但差异真的可以忽略不计)