说我已经下面的矩阵:

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
有帮助吗?

解决方案

这里的一线解决方案的使用 reshapepermute:

C = 3;          % Number of columns
R = 6;          % Number of rows
newR = 2;       % New number of rows
A = randi(10, [R C]);  % 6-by-3 array of random integers
B = permute(reshape(A.', [C newR R/newR]), [2 1 3]);

这当然需要 newR 将匀入 R.

其他提示

这是一个衬垫 reshapepermute, 但没有调换输入阵列

out = permute(reshape(A,newR,size(A,1)/newR,[]),[1 3 2]);

, ,哪里 newR 是的数量行 3D 阵列的输出。


基准

这部分比较的拟议方法在这个职位针对的 other solution with reshape, permute & transpose 在绩效。该datasizes是膨胀的相称性,那些列出的问题。因此, A60000 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.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top