richi12
richi12

Reputation: 11

Making two matrix from one

I have a matrix that I would like to split into two separate matrices based on a set of conditions.

The input matrix can be generated with the following code:

lbits = 8;
ntags = 10;

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

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

Which returns:

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

My conditions are:

  1. If place of bit '1' is on position lbits/2 or higher, add the row to matrix A
  2. If place of bit '1' is less then position lbits/2, add the row to matrix B

With the above TagAnswer I want the 2nd, 5th and 7th rows to be moved into B and the remaining rows moved into matrix A

Upvotes: 1

Views: 62

Answers (1)

sco1
sco1

Reputation: 12214

Assuming my edit is correct, you can use the row and column outputs of find to index TagAnswer and pull the rows based on your conditions:

% 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)), :);

For my test case I have:

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

Edit: Because MATLAB stores data column-major, find also works column-major and will likely lose the row ordering. If it important to preserve the row ordering of TagAnswer in A and B you can use sort after the find call:

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

Upvotes: 3

Related Questions