我有一個遞歸過程,每次循環迭代時都會生成一個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數組代碼所用的時間對你來說並沒有什麼不同。在我的系統中,後者要慢得多。 –