我有一个2D矩阵,其中列的№总是3的倍数(例如250×27
) - 由于结果的重复组织(A,B,C
,A,B,C
,{ {1}},等等。我希望重新整形此矩阵以创建一个包含3列的新矩阵 - 每个列包含每种类型的汇总数据(A,B,C
)(例如A,B,C
)。
因此,在2250×3
的矩阵中,列250×27
中的所有数据都将合并,以形成生成的重新整形矩阵的第一列。
生成的重新整形矩阵中的第二列将包含列1,4,7,10,13,16,19,22,25
中的所有数据 - 依此类推。
在MATLAB中有一种简单的方法吗?我只知道如果要合并的列是相邻的(2,5,8,11,14,17,20,23,26
)而不是非相邻的(reshape
)等,则使用1,2,3,4,5,6
。
答案 0 :(得分:4)
来自@Divakar的无耻窃取:
B = reshape( permute( reshape(A,size(A,1),3,[]), [1,3,2]), [], 3 );
答案 1 :(得分:2)
让A
成为你的矩阵。您可以将每个第三列保存在一个矩阵中,如:
(请注意,您不必单独将它们保存为矩阵,但这样可以更容易阅读此示例)。
A = rand(27); %as test
B = A(:,1:3:end);
C = A(:,2:3:end);
D = A(:,3:3:end);
然后你使用重塑:
B = reshape(B,[],1);
C = reshape(C,[],1);
D = reshape(D,[],1);
最后把它们放在一起:
A = [B C D];
答案 2 :(得分:2)
您可以将每组列视为单个项目,并一起进行三次重组。这应该可以解决问题:
[另存为" reshape3.m"在Matlab文件夹中将文件称为函数]
function out = reshape3(in)
[~,C]=size(in); % determine number of columns
if mod(C,3) ~=0
error('ERROR: Number of rows must be a multiple of 3')
end
R_out=numel(in)/3; % number of rows in output
% Reshape columns 1,4,7 together as new column 1, column 2,5,8 as new col 2 and so on
out=[reshape(in(:,1:3:end),R_out,1), ...
reshape(in(:,2:3:end),R_out,1), ...
reshape(in(:,3:3:end),R_out,1)];
end
答案 3 :(得分:1)
假设你有一个3x6矩阵A
A = [1 2 3 4 5 6;6 5 4 3 2 1;2 3 4 5 6 7]
A =
1 2 3 4 5 6
6 5 4 3 2 1
2 3 4 5 6 7
你提取矩阵的大小
b =size(A)
然后提取每一行的第三列
c1 = A((1:b(1)),[1:3:b(2)])
c2 = A((1:b(1)),[2:3:b(2)])
c3 = A((1:b(1)),[3:3:b(2)])
并将它们放在一个矩阵中
A_result = [c1(:) c2(:) c3(:)]
A_result =
1 2 3
6 5 4
2 3 4
4 5 6
3 2 1
5 6 7
答案 4 :(得分:1)
我的2美分:
nRows = size(matrix, 1);
nBlocks = size(matrix, 2) / 3;
matrix = reshape(matrix, [nRows 3 nBlocks]);
matrix = permute(matrix, [1 3 2]);
matrix = reshape(matrix, [nRows * nBlocks 1 3]);
matrix = reshape(matrix(:), [nRows * nBlocks 3]);
答案 5 :(得分:0)
这是我的2分钟拍摄:
rv = @(x) x(:);
ind = 1:3:size(A,2);
B = [rv(A(:,ind)) rv(A(:,ind+1)) rv(A(:,ind+2))];
保存了一些丑陋的reshape
,虽然可能有点慢。
答案 6 :(得分:0)
如果你有图像处理工具箱,im2col
是一个非常方便的解决方案:
out = im2col(A,[1 4], 'distinct').'
答案 7 :(得分:-2)
试试Matlab function mat2cell,我认为这种形式是允许的。
X is the "start matrix"
C = mat2cell(X, [n], [3, 3, 3]); %n is the number of rows, repeat "3" as many times as you nedd
%extract every matrix
C1 = C{1,1}; %first group of 3 columns
C2 = C{1,2}; %second group of 3 columns
%repeat for all your groups
%join the matrix with vertcat
Cnew = vertcat(C1,C2,C3); %join as many matrix n-by-3 as you have