将矩阵折叠成列

时间:2016-11-09 11:54:58

标签: arrays matlab matrix reshape

我有一个2D矩阵,其中列的№总是3的倍数(例如250×27) - 由于结果的重复组织(A,B,CA,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

8 个答案:

答案 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