将重复行移动到矩阵中的新列

时间:2016-01-19 20:39:35

标签: matlab matrix plot

我正在处理一个n x 1矩阵A,它内部有重复值:

A = [0;1;2;3;4;   0;1;2;3;4;   0;1;2;3;4;    0;1;2;3;4]

对应于B值的n×1矩阵:

B = [2;4;6;8;10;  3;5;7;9;11;  4;6;8;10;12;  5;7;9;11;13]

我正在尝试生成一个通用代码,将每个重复放入一个单独的列中,并将其存储到Aa和Bb中,例如:

Aa = [0  0  0  0     Bb = [2  3  4  5
      1  1  1  1           4  5  6  7
      2  2  2  2           6  7  8  9
      3  3  3  3           8  9  10 11
      4  4  4  4]          10 11 12 13]

基本上,A和B的每次重复都需要复制到下一列,然后从第一列中删除

Visual description of matrix row shifting to columns (paint)

到目前为止,我已经设法识别出有多少重复并将整个列复制到下一列,然后是下一列的重复次数,但我的方法不会将矩阵行移到列中

clc;clf;close all
A = [0;1;2;3;4;0;1;2;3;4;0;1;2;3;4;0;1;2;3;4];
B = [2;4;6;8;10;3;5;7;9;11;4;6;8;10;12;5;7;9;11;13];

desiredCol = 1; %next column to go to
destinationCol = 0; %column to start on
n = length(A);
for i = 2:1:n-1
 if A == 0;
   A = [ A(:, 1:destinationCol)...
         A(:, desiredCol+1:destinationCol)...
         A(:, desiredCol)...
         A(:, destinationCol+1:end) ];
 end
end

Move a set of N-rows to another column in MATLAB

中检索到A = [...]

任何提示都会非常感激。如果您需要进一步解释,请告诉我们!

谢谢!

2 个答案:

答案 0 :(得分:2)

如果你说你已经知道重复的子向量,以及它重复的次数那么它是相对直接的:

首先使用repmat函数制作新的A矩阵。 然后将B向量重新映射为与新A矩阵

相同的大小
% Given that you already have the repeated subvector Asub, and the number
% of times it repeats; An:


Asub = [0;1;2;3;4];
An = 4;
lengthAsub = length(Asub);

Anew = repmat(Asub, [1,An]);

% If you can assume that the number of elements in B is equal to the number
% of elements in A:

numberColumns = size(Anew, 2);

newB = zeros(size(Anew));
for i = 1:numberColumns
    indexStart = (i-1) * lengthAsub + 1;
    indexEnd = indexStart + An;
    newB(:,i) = B(indexStart:indexEnd);
end

如果您不知道原始A向量中的内容,但确实知道它是重复的,如果您认为该模式没有重复,则可以使用find函数查找当第一个元素重复时:

lengthAsub = find(A(2:end) == A(1), 1);
Asub = A(1:lengthAsub);
An = length(A) / lengthAsub

希望这与您的数据相符:唯一的原因是A中的子向量是一种没有唯一数字的模式,例如:

A = [0;1;2;3;2;1;0;   0;1;2;3;2;1;0;   0;1;2;3;2;1;0;   0;1;2;3;2;1;0;]

值得注意的是,从上面直观地你会得到lengthAsub = find(A(2:end) == A(1), 1) - 1;,但这不是必要的,因为你只是通过查看矩阵A(2:end)已经有效地取消了这个。

答案 1 :(得分:2)

鉴于我们在评论中的讨论,您只需使用reshape将已知维度的矩阵转换为具有指定维度的输出矩阵,前提是元素数量匹配。您希望将具有一定量重复模式的向量转换为矩阵,其中每列具有这些重复实例之一。 reshape以列为主的顺序创建一个矩阵,其中值按列方式采样,矩阵以这种方式填充。这非常适合您的情况。

假设你已经知道有多少"重复"我们称之为An,我们只需要对您的向量进行重新整形,使其具有T = n / An行,其中n是向量的长度。这样的事情会起作用。

n = numel(A); T = n / An;
Aa = reshape(A, T, []); 
Bb = reshape(B, T, []);

第三个参数有空括号,这告诉MATLAB可以推断出有T行的列数。从技术上讲,这只是An列,但很高兴向您展示MATLAB的灵活性。