将矩阵折叠成列
Collapsing matrix into columns
我有一个二维矩阵,其中列的 № 始终是 3 的倍数(例如 250×27
)- 由于结果的重复组织(A,B,C
、A,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))];
节省了一些丑陋的 reshape
s,但可能会慢一点。
我的 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').'
我有一个二维矩阵,其中列的 № 始终是 3 的倍数(例如 250×27
)- 由于结果的重复组织(A,B,C
、A,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))];
节省了一些丑陋的 reshape
s,但可能会慢一点。
我的 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').'