How to combine vectors based on value?

3 views (last 30 days)
Chameleon17
Chameleon17 on 14 Oct 2015
Commented: Chameleon17 on 16 Oct 2015
Good Afternoon,
Another quick question. Say I have a matrix,
B = [732145 732151 732168 0 0 0 0
284 281 297 0 0 0 0]
and
C =
[ 0 281 284 0 0 297 0
0 0 0 0 0 0 0]
I am trying to get it so that I have:
D = [0 281 284 0 0 297 0
0 732151 732145 0 0 732168 0].
Should I be using the [r c] kind of terminology. I keep almost getting there, I think, then I get confused.
Any thoughts would be greatly appreciated! or reading!
Thank you very much for any time!

Answers (3)

Guillaume
Guillaume on 16 Oct 2015
Regarding your latest comment, a much simpler way of obtaining your D result, assumming that elements of B and C are uniques is:
assert(numel(unique(C)) == numel(C) && numel(unique(B)) == numel(B)); %does not work if elements are not unique
[values, ic, ib] = intersect(C, B);
D = zeros(numel(C), numel(B));
D(sub2ind(size(D), ic, ib)) = values;
If the values of B and C are not unique, you need an additional level of indirection through unique.
  1 Comment
Chameleon17
Chameleon17 on 16 Oct 2015
Thank you for that, i've not used the intersect before, that's good to know!
The values of B are all unique - but I may have repeats of the C values at certain times.

Sign in to comment.


Andrei Bobrov
Andrei Bobrov on 16 Oct 2015
B = [4 5 6 7; 0 0 0 0; 0 0 0 0; 0 0 0 0];
C = [0; 5; 4];
D = B;
[ll,idx] = ismember(B(1,:),C);
D(sub2ind(size(D),1+idx(ll),find(ll))) = C(idx(ll));

Geoff Hayes
Geoff Hayes on 14 Oct 2015
Do you wish to simply iterate over each element in the first row of C and, for those that are non-zero, check to see if it exists in the second row of matrix B and copy the the value from its first row into D? If so, try the following
D = C;
for k=1:size(C,2)
if C(1,k) ~= 0
[idx] = find(B(2,:)==C(1,k));
if ~isempty(idx)
D(2,k) = B(1,idx);
end
end
end
In the above, we just iterate over each column in the first row of C. If the element is non-zero then we use find to find that element of the second row of B that matches the value in C. If the returned index, idx, is non-empty then we set this value to the corresponding element of D.
  5 Comments
Guillaume
Guillaume on 16 Oct 2015
Edited: Guillaume on 16 Oct 2015
I assume you've made a typo and that the for loops are actually:
for h = 1:g
for m = 1:k
Chameleon17
Chameleon17 on 16 Oct 2015
Ah yes, I had a bunch of them, it is also D(h+1,m) too!

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!