从一个制作两个矩阵

时间:2015-11-25 12:42:39

标签: arrays matlab matrix

我有一个矩阵,我想根据一组条件分成两个单独的矩阵。

可以使用以下代码生成输入矩阵:

lbits = 8;
ntags = 10;

k = randi(lbits,1,ntags);
Tag  = zeros(lbits,ntags);

Tag(lbits*(find(k)-1) + k)=1;
TagAnswer = Tag';

返回:

TagAnswer =

     0     0     0     1     0     0     0     0
     0     1     0     0     0     0     0     0
     0     0     0     0     1     0     0     0
     0     0     0     0     0     0     0     1
     0     1     0     0     0     0     0     0
     0     0     0     0     0     1     0     0
     0     0     1     0     0     0     0     0
     0     0     0     0     0     1     0     0
     0     0     0     0     0     0     0     1
     0     0     0     0     0     0     1     0

我的条件是:

  1. 如果位于第一位' 1'位于lbits/2或更高位置,将行添加到矩阵A
  2. 如果位于第一位' 1'小于位置lbits/2,将行添加到矩阵B
  3. 使用上面的TagAnswer我想将第2行,第5行和第7行移到B,其余行移入矩阵A

1 个答案:

答案 0 :(得分:3)

假设我的编辑是正确的,您可以使用findrowcolumn输出来索引TagAnswer并根据您的条件提取行:

% Generate sample data
lbits = 8;
ntags = 10;

k = randi(lbits,1,ntags);
Tag  = zeros(lbits,ntags);

Tag(lbits*(find(k)-1) + k)= 1;
TagAnswer = Tag';

% Find bit locations and distribute rows accordingly
[r, c] = find(TagAnswer);
A = TagAnswer(r(c>=(lbits/2)), :);
B = TagAnswer(r(c<(lbits/2)), :);

对于我的测试用例,我有:

TagAnswer =

     0     0     0     0     0     0     0     1
     0     1     0     0     0     0     0     0
     0     0     1     0     0     0     0     0
     0     0     0     1     0     0     0     0
     0     0     0     1     0     0     0     0
     0     0     0     0     1     0     0     0
     0     0     0     0     0     0     1     0
     0     0     0     0     0     1     0     0
     0     0     0     0     0     1     0     0
     0     0     1     0     0     0     0     0



A =

     0     0     0     1     0     0     0     0
     0     0     0     1     0     0     0     0
     0     0     0     0     1     0     0     0
     0     0     0     0     0     1     0     0
     0     0     0     0     0     1     0     0
     0     0     0     0     0     0     1     0
     0     0     0     0     0     0     0     1



B =

     0     1     0     0     0     0     0     0
     0     0     1     0     0     0     0     0
     0     0     1     0     0     0     0     0

编辑:由于MATLAB存储数据列专用,find也可以使用列专业,并且可能会丢失行排序。如果在TagAnswerA中保留B的行排序很重要,则可以在find调用后使用sort

[r, sortidx] = sort(r);
c = c(sortidx);