[英]split long 2D matrix into the third dimension
说我有以下矩阵:
A = randi(10, [6 3])
7 10 3
5 5 7
10 5 1
6 5 10
4 9 1
4 10 1
我想提取每两行并将它们放入第三维,因此结果如下:
B(:,:,1) =
7 10 3
5 5 7
B(:,:,2) =
10 5 1
6 5 10
B(:,:,3) =
4 9 1
4 10 1
我显然可以使用for循环执行此操作,只是想知道如何使用permute / reshape / ..更加优雅地进行单线程 (注意矩阵大小和步骤必须是参数)
% 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
并对表现other solution with reshape, permute & transpose
。 数据集与问题中列出的数据集成比例。 因此, A
是60000 x 300
大小,我们将它拆分,使得3D
输出将具有200 rows
,因此dim-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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.