How to combine vectors based on value?
7 次查看(过去 30 天)
显示 更早的评论
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 个评论
回答(3 个)
Guillaume
2015-10-16
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
2015-10-16
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 个评论
Geoff Hayes
2015-10-14
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.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!