How to combine vectors based on value?

4 ビュー (過去 30 日間)
Chameleon17
Chameleon17 2015 年 10 月 14 日
コメント済み: Chameleon17 2015 年 10 月 16 日
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!

回答 (3 件)

Guillaume
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.
  1 件のコメント
Chameleon17
Chameleon17 2015 年 10 月 16 日
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.

サインインしてコメントする。


Andrei Bobrov
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));

Geoff Hayes
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.
  5 件のコメント
Guillaume
Guillaume 2015 年 10 月 16 日
編集済み: Guillaume 2015 年 10 月 16 日
I assume you've made a typo and that the for loops are actually:
for h = 1:g
for m = 1:k
Chameleon17
Chameleon17 2015 年 10 月 16 日
Ah yes, I had a bunch of them, it is also D(h+1,m) too!

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by