4

我在执行以下任务时遇到问题:假设一个 3x6 矩阵:

一个=

0.2787    0.2948    0.4635    0.8388    0.0627    0.0435
0.6917    0.1185    0.3660    0.1867    0.2383    0.7577
0.6179    0.7425    0.0448    0.4009    0.9377    0.4821

我想做的是将矩阵分成块,如下所示:

一个=

0.2787    0.2948  |  0.4635    0.8388  |  0.0627    0.0435
0.6917    0.1185  |  0.3660    0.1867  |  0.2383    0.7577
0.6179    0.7425  |  0.0448    0.4009  |  0.9377    0.4821

并垂直连接这些块以获得最终结果:

0.2787    0.2948 
0.6917    0.1185  
0.6179    0.7425  
0.4635    0.8388
0.3660    0.1867
0.0448    0.4009
0.0627    0.0435
0.2383    0.7577
0.9377    0.4821

我想如果我能得到帮助,那么我也许可以为任意矩阵 A 做这件事。我可以使用 for 循环解决上述问题,但我正在寻找一个向量化的解决方案。

提前致谢!N。

4

5 回答 5

3

考虑以下:

A = rand(3,6);
blkSz = 2;

C = mat2cell(A, size(A,1), blkSz*ones(1,size(A,2)/blkSz));
C = cat(1,C{:})

这假设它size(A,2)可以被整除blkSz

于 2012-06-05T21:03:54.377 回答
3

这适用于您的矩阵所在的位置A以及您想要的位置D

C = mat2cell(A,[3],[2 2 2])
D = cat(1,C{:})
于 2012-06-05T21:15:47.223 回答
2

没有 cell2mat, (仅使用reshapes 和)也可以做到这一点,permute因此速度要快得多!

您需要使用“第三维”。它类似于 split long 2D matrix into the third dimension中描述的内容。

这是上述矩阵的解决方案:

A1 = reshape(A, 3, 2, []);  % 3rd dimension is numel(A)/2/3
A2 = permute(A1, [2 1 3]);  % transpose 1st and 2nd dimension
Ans= reshape(A2, 2, [])' ;  % note the transpose

对于这种大小的矩阵,运行时间的差异可以忽略不计。但是,对于大型矩阵,差异超过一个数量级:

A=rand(3, 2*10000);

%% good method

tic
A1 = reshape(A, 3, 2, []); %3rd dimension is numel(A)/2/3
A2 = permute(A1, [2 1 3]);
A3 = reshape(A2, 2, [])' ; %note the transpose'
toc

%% mat2cell method

tic
blkSz = 2;
C = mat2cell(A, size(A,1), blkSz*ones(1,size(A,2)/blkSz));
B3 = cat(1,C{:});
toc

%% make sure the answer is the same:
assert(max(A3(:)-B3(:))==0)

输出:

>> Elapsed time is 0.001202 seconds.
>> Elapsed time is 0.043115 seconds.
于 2016-03-14T16:42:07.310 回答
1

这个怎么样:

width = 2; 
m = length(A(:))/width;
fn = @(i) reshape(A(:, i:width:end), m, 1);
B = cell2mat(arrayfun(fn, 1:width, 'UniformOutput', false));

width只需在变量中指定一次需要多少列。

于 2012-06-05T21:06:34.643 回答
0

通过垂直连接,假设矩阵宽度可被 3 整除:

B = [ A(:,1:(size(A,2)/3)); A(:,size(A,2)/3+1:size(A,2)/3*2); A(:,size(A,2)/3*2+1:end) ];
于 2012-06-05T21:20:04.097 回答