基于条件将矢量划分为许多较小的矢量

时间:2015-03-19 00:26:52

标签: matlab

我有两个向量(长度= 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 ];

1 个答案:

答案 0 :(得分:1)

非矩形

由于Matlab无法处理非矩形矩阵(如您的示例所示),因此您必须回退到单元格数组以存储每个输出向量。 您可以使用logical indexarrayfun

过滤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