How to combine vectors based on value?
    6 views (last 30 days)
  
       Show older comments
    
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!
0 Comments
Answers (3)
  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.
  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));
0 Comments
  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.
See Also
Categories
				Find more on Loops and Conditional Statements in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!