我有一个递归过程,每次循环迭代时都会生成一个2x2矩阵。我希望以后能够调用这些矩阵,但我不确定如何有效地将它们存储在一起。
如果程序迭代了n次,我应该将它们存储在2nx2矩阵中吗?但是接下来我将如何调用这个长矩阵中的第j个矩阵(第2j-1行和第2j行)?
谢谢!
答案 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“切片”方法一样快(甚至更快,但差异实际上可以忽略不计)