我有一个递归过程,每次循环迭代时都会生成一个2x2矩阵。我希望能够在稍后调用这些矩阵中的每一个,但我不确定如何有效地将它们全部存储在一起。Matlab:n个2x2矩阵的高效存储
如果该过程迭代n次,我应该将它们存储在2nx2矩阵中吗?但是,那么我怎么会要求在这个长矩阵内说第j个矩阵(第2j-1和2j行)呢?
谢谢!
我有一个递归过程,每次循环迭代时都会生成一个2x2矩阵。我希望能够在稍后调用这些矩阵中的每一个,但我不确定如何有效地将它们全部存储在一起。Matlab:n个2x2矩阵的高效存储
如果该过程迭代n次,我应该将它们存储在2nx2矩阵中吗?但是,那么我怎么会要求在这个长矩阵内说第j个矩阵(第2j-1和2j行)呢?
谢谢!
您可以使用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}
(注意大括号)。
你也可以将其存储在一个大的二维数组(如你所说),
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,:)
或三维阵列,像这样,
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给出了三个很好的选择来存储他的答案矩阵(我已经upvoted)。我只是想改善三者中最慢的一个。我建立了一个大的宽矩阵(2×2 * n),而不是一个高矩阵(2×n×2)。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“切片”方法一样快(甚至更快,但差别实际上可以忽略不计)
但是,请注意,内存消耗这种单元方法比在'2×2×n'3D矩阵中存储'n''2×2'矩阵大4倍。另一方面,细胞方法似乎比在2×2×n矩阵中存储二维矩阵要快得多。 –
@ H.Muster:确实。这一直让我感到奇怪;细胞“应该”不过是指向数据的容器,对吧?但那并不是 - 很快 - 发生了什么......无论如何,我会为了完整而编辑它。 –
很好的答案(+1)。我有点困惑,单元代码和2x2xn数组代码所用的时间对你来说并没有什么不同。在我的系统中,后者要慢得多。 –