将矩阵折叠成列

Collapsing matrix into columns

我有一个二维矩阵,其中列的 № 始终是 3 的倍数(例如 250×27)- 由于结果的重复组织(A,B,CA,B,C , A,B,C, 等等)。我希望重塑此矩阵以创建一个包含 3 列的新矩阵 - 每列包含每种类型的聚合数据 (A,B,C)(例如 2250×3)。

因此,在 250×27 的矩阵中,第 1,4,7,10,13,16,19,22,25 列中的所有数据将被合并以形成结果重塑矩阵的第一列。

生成的重塑矩阵中的第二列将包含来自列 2,5,8,11,14,17,20,23,26 的所有数据 - 依此类推。

有没有在 MATLAB 中执行此操作的简单方法?我只知道如何使用 reshape 如果我想合并的列是相邻的 (1,2,3,4,5,6) 而不是不相邻的 (1,4,7,10,13,16) 等

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];

您可以将每组列视为一个项目,然后一起进行三个整形。这应该可以解决问题:

[在您的 Matlab 文件夹中另存为 "reshape3.m" 文件以将其作为函数调用]

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

尝试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

假设您有一个 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

这是我 2 分钟的看法:

rv  = @(x) x(:);
ind = 1:3:size(A,2);
B   = [rv(A(:,ind)) rv(A(:,ind+1)) rv(A(:,ind+2))];

节省了一些丑陋的 reshapes,但可能会慢一点。

我的 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]);

的无耻窃取:

B = reshape( permute( reshape(A,size(A,1),3,[]), [1,3,2]), [], 3 );

如果您有 图像处理工具箱im2col 是一个非常方便的解决方案:

out = im2col(A,[1 4], 'distinct').'