How to match elements of matrix having different dimensions?

2 visualizaciones (últimos 30 días)
Megha
Megha el 5 de Nov. de 2018
Comentada: Guillaume el 6 de Nov. de 2018
if true
% code
endI have some dates in say variable A as 10x6 double form :
2000 01 01 00 00 01
2000 01 01 00 00 02
2000 01 01 00 00 03
...
...
...
2000 01 01 00 00 09
2000 01 01 00 00 10
Now another matrix B as 5x6 double form :
2000 01 01 00 00 01
2000 01 01 00 00 02
2000 01 01 00 00 03
2000 01 01 00 00 09
2000 01 01 00 00 10
Now i would like to find the row index of A where elements of B are found. i.e. answer = row index: 1,2,3,9,10.
I tried
idx = ismember(A, B,'rows'); % it does not work!
so i tried,
idx = ismember(B, A,'rows'); % which also does not work!
So i used conventional hour-taking method:
% tic
% idx = nan(length(A),1);
% for i = 1:A
% for j = 1:B
% if isequal(A(i,:), B(j,:))
% idx(i,1) = j;
% end
% end
% end
% toc
Any short-cut to solve this...?

Respuesta aceptada

Guillaume
Guillaume el 5 de Nov. de 2018
find the row index of A where elements of B are found
ismember is indeed the function for that, so you will have to explain why it does not work. In this particular case:
isinB = ismember(A, B, 'rows');
Note that I've changed the name of the return variable to something more accurate than idx since the first output of ismember is not indices but a logical vector indicating whether the corresponding row of A is found in B. If you do want indices:
idx = find(isinB);
However, more often than not, it is easier to work with the logical vector and find is just a waste of time.
  2 comentarios
madhan ravi
madhan ravi el 5 de Nov. de 2018
idx = find(isinB) %remove semicolon it gives the exact answer you want
Guillaume
Guillaume el 6 de Nov. de 2018
I have no answer! if i know why it doesnt work, whats the point of posting it here!
"It doesn't work" is a useless statement on its own. In what does it not work? Do you get an error message? If so, what is the error message? Do you get a different result than what you expected? If so, what do you get and what did you expect?
As I said, ismember is the function required and it gives the correct result. So if it doesn't work for you, we need to undersand why.
>> a = datevec(datetime(2000,1,1,0,0,0) + seconds(1:10)')
a =
2000 1 1 0 0 1
2000 1 1 0 0 2
2000 1 1 0 0 3
2000 1 1 0 0 4
2000 1 1 0 0 5
2000 1 1 0 0 6
2000 1 1 0 0 7
2000 1 1 0 0 8
2000 1 1 0 0 9
2000 1 1 0 0 10
>> b = datevec(datetime(2000,1,1,0,0,0) + seconds([1; 2; 3; 9; 10]))
b =
2000 1 1 0 0 1
2000 1 1 0 0 2
2000 1 1 0 0 3
2000 1 1 0 0 9
2000 1 1 0 0 10
>> idx = find(ismember(a, b, 'rows'))
idx =
1
2
3
9
10
As you can see it produces the exact output you asked for.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Data Type Identification en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by