using find(ismember) instead of a loop?
5 次查看(过去 30 天)
显示 更早的评论
I have matrix B which is has around 1 million rows and Matrix A which has 800,000 rows. I want to match the observations of A and B and then assign to A the observations of B that matches. I tried a loop which taking forever in terms of time. I am wondering if I can do it in one shot using find(ismember). below are my codes:
for i=1:size(B,1)
x0=find(A(:,2)==B(i,2) & A(:,1)==B(i,1));
B(i,8)=A(x0,9);
end
2 个评论
Matt J
2016-10-4
编辑:Matt J
2016-10-4
I suspect you haven't shown your actual code, making it hard to interpret what you are trying to do. In the posted code, you are comparing columns of A with rows of B which should be producing errors like the following, unless you are using R2016b
>> [1 2 3] == [1;2;3]
Error using ==
Matrix dimensions must agree.
Also, the code you've shown uses only the 1st, 2nd, and 9th column of A. So, why is it significant that "A has 800000 rows"?
采纳的回答
Guillaume
2016-10-4
编辑:Guillaume
2016-10-4
Note that the find was completely unnecessary in your original example, you could just have used the logical array returned by the comparison:
x0=A(:,2)==B(i,2) & A(:,1)==B(i,1);
B(i,8)=A(x0,9); %would have worked exactly the same with marginal speed gain.
To answer your question:
[found, Arow] = ismember(B(:, 1:2), A(:, 1:2), 'rows');
B(found, 8) = A(Arow(found), 9);
0 个评论
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!