分裂长2D矩阵进入第三尺寸
-
21-09-2019 - |
题
说我已经下面的矩阵:
A = randi(10, [6 3])
7 10 3
5 5 7
10 5 1
6 5 10
4 9 1
4 10 1
我想提取的每一个2行,把他们进入第三个层面,因此结果将是,如:
B(:,:,1) =
7 10 3
5 5 7
B(:,:,2) =
10 5 1
6 5 10
B(:,:,3) =
4 9 1
4 10 1
我显然可以这样做与一种循环,只是想知道如何做到这一点更优雅一衬里使用 重排/重塑/..(说明矩阵的大小和步骤必须参数)
% params
step = 5;
r = 15;
c = 3;
% data
A = randi(10, [r c]);
B = zeros(step, c, r/step); % assuming step evenly divides r
% fill
counter = 1;
for i=1:step:r
B(:,:,counter) = A(i:i+step-1, :);
counter = counter + 1;
end
其他提示
这是一个衬垫 reshape
和 permute
, 但没有调换输入阵列
out = permute(reshape(A,newR,size(A,1)/newR,[]),[1 3 2]);
, ,哪里 newR
是的数量行 3D
阵列的输出。
基准
这部分比较的拟议方法在这个职位针对的 other solution with reshape, permute & transpose
在绩效。该datasizes是膨胀的相称性,那些列出的问题。因此, A
是 60000 x 300
大小我们将它分割这样的 3D
输出会 200 rows
并因此暗淡-3会 300
项。
基准代码-
%// Input
A = randi(10, [60000 300]); %// 2D matrix
newR = 200; %// New number of rows
%// Warm up tic/toc.
for k = 1:50000
tic(); elapsed = toc();
end
N_iter = 5; %// Number of iterations for each approach to run with
disp('---------------------- With PERMUTE, RESHAPE & TRANSPOSE')
tic
for iter = 1:N_iter
[R,C] = size(A);
B = permute(reshape(A',[C newR R/newR]),[2 1 3]); %//'
end
toc, clear B R C iter
disp('---------------------- With PERMUTE & RESHAPE')
tic
for iter = 1:N_iter
out = permute(reshape(A,newR,size(A,1)/newR,[]),[1 3 2]);
end
toc
输出
---------------------- With PERMUTE, RESHAPE & TRANSPOSE
Elapsed time is 2.236350 seconds.
---------------------- With PERMUTE & RESHAPE
Elapsed time is 1.049184 seconds.
不隶属于 StackOverflow