我有两个向量(长度= 172992),A
有一些双数据而B
只有0,1,2,3和4作为值。我需要移动两个向量并检查B
的值。如果B
不为零,则创建一个新向量并将该索引中的所有A
的值放入其中,直到B
返回为零,依此类推..然后创建一个包含所有的矩阵新创建的向量。任何帮助??
%Example:
A = [1 2 3 4 5 6 0 0 0 0 7 7 7 7 7 7 0 0 0 0 4 4 4 4 4 4 ];
B = [1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 0 0 0 0 3 3 3 3 3 3 ];
%The output:
Mat = [ 1 2 3 4 5 6; 7 7 7 7 7 7 ;4 4 4 4 4 4 ];
答案 0 :(得分:1)
由于Matlab无法处理非矩形矩阵(如您的示例所示),因此您必须回退到单元格数组以存储每个输出向量。
您可以使用logical index和arrayfun
A
的元素
>> A = [1 2 3 5 6 0 0 0 0 7 7 7 7 7 7 0 0 0 0 4 4 4 4 4 4 ];
>> B = [1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 0 0 0 0 3 3 3 3 3 3 ];
>> sol = arrayfun(@(c) A(B==c),1:max(B),'UniformOutput',false)
sol =
[1x5 double] [1x6 double] [1x6 double]
然后,您可以将各个向量放入自己的变量中,如此
[m1,m2,m3] = sol{:};
对于矩形数据(即,将4
添加到A
的第一个分组中),您可以更轻松地创建矩阵(仍然使用逻辑索引):
>> A = [1 2 3 4 5 6 0 0 0 0 7 7 7 7 7 7 0 0 0 0 4 4 4 4 4 4 ];
>> B = [1 1 1 1 1 1 0 0 0 0 2 2 2 2 2 2 0 0 0 0 3 3 3 3 3 3 ];
>> reshape(A(B~=0),nnz(B)/max(B),max(B))'
ans =
1 2 3 4 5 6
7 7 7 7 7 7
4 4 4 4 4 4