我正在处理一个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的每次重复都需要复制到下一列,然后从第一列中删除
到目前为止,我已经设法识别出有多少重复并将整个列复制到下一列,然后是下一列的重复次数,但我的方法不会将矩阵行移到列中
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 = [...]任何提示都会非常感激。如果您需要进一步解释,请告诉我们!
谢谢!
答案 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的灵活性。