Filter löschen
Filter löschen

find a row in a multidimensional cell array

1 Ansicht (letzte 30 Tage)
Wasim Aftab
Wasim Aftab am 4 Jul. 2017
Bearbeitet: Wasim Aftab am 2 Feb. 2018
Hi, I have a cell variable as follows, temp =
'FBgn0039563' 'FBgn0259937' [0.6195]
'FBgn0039563' 'FBgn0024733' [0.5698]
'FBgn0039563' 'FBgn0011236' [0.5247]
'FBgn0039563' 'FBgn0053864' [0.5155]
'FBgn0039563' 'FBgn0035951' [0.5781]
'FBgn0039563' 'FBgn0001224' [0.5462]
'FBgn0039563' 'FBgn0002914' [0.5162]
'FBgn0039563' 'FBgn0264492' [0.8405]
'FBgn0039563' 'FBgn0000259' [0.7570]
'FBgn0039563' 'FBgn0004103' [0.5374]
I want to search a key =['FBgn0039563' 'FBgn0264492' [0.8405]] inside temp. I need the row index of key in temp. Is it possible?
Thanks in advance,
Best Regards, Wasim
  1 Kommentar
Wasim Aftab
Wasim Aftab am 26 Sep. 2017
Bearbeitet: Wasim Aftab am 26 Sep. 2017
Hi, for the attached case, snippets are not yielding correct results, I have a smaller list with N rows and 2 columns, and I want to search them inside a bigger list temp with M rows and two columns. Also if I want to search the otherway around. In both cases it should consider each row as a whole entity and when found accumulate its index in a vector. Is it possible without loops? I will appreciate if the snippet is as general as possible i.e. it can cover most of the test cases. Thanks in advance for your time, Best Regards, Wasim

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

the cyclist
the cyclist am 4 Jul. 2017
Bearbeitet: the cyclist am 4 Jul. 2017
Here is one way:
% Your variables
temp = { ...
'FBgn0039563' 'FBgn0259937' [0.6195]
'FBgn0039563' 'FBgn0024733' [0.5698]
'FBgn0039563' 'FBgn0011236' [0.5247]
'FBgn0039563' 'FBgn0053864' [0.5155]
'FBgn0039563' 'FBgn0035951' [0.5781]
'FBgn0039563' 'FBgn0001224' [0.5462]
'FBgn0039563' 'FBgn0002914' [0.5162]
'FBgn0039563' 'FBgn0264492' [0.8405]
'FBgn0039563' 'FBgn0000259' [0.7570]
'FBgn0039563' 'FBgn0004103' [0.5374]};
key = {'FBgn0039563' 'FBgn0264492' [0.8405]};
% Define some temporary string variables
temp2 = cellfun(@num2str,temp,'UniformOutput',false);
key2 = cellfun(@num2str,key, 'UniformOutput',false);
% Compare rows to get the index you want
rowIndex = find(all(ismember(temp2,key2),2));
This solution is based on information I found in this answer, after a keyword search.
  2 Kommentare
Wasim Aftab
Wasim Aftab am 5 Jul. 2017
Hi "the cyclist", It is an awesome snippet. it can find indices of a single row as well as multiple rows. Thanks and Best Regards. Wasim
Wasim Aftab
Wasim Aftab am 26 Sep. 2017
Bearbeitet: Wasim Aftab am 26 Sep. 2017
Hi, for the attached case, snippets are not yielding correct results, I have a smaller list with N rows and 2 columns, and I want to search them inside a bigger list temp with M rows and two columns. Also if I want to search the otherway around. In both cases it should consider each row as a whole entity and when found accumulate its index in a vector. Is it possible without loops? I will appreciate if the snippet is as general as possible i.e. it can cover most of the test cases. Thanks in advance for your time, Best Regards, Wasim

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Jan
Jan am 4 Jul. 2017
Search = {'FBgn0039563' 'FBgn0264492' [0.8405]}
Match = strcmp(temp(:, 1), Search{1}) & ...
strcmp(temp(:, 2), Search{2}) & ...
cat(1, temp{:, 3}) == Search{3};
Index = find(Match);
  3 Kommentare
Jan
Jan am 5 Jul. 2017
@Wasim Aftab: And therefore it would be useful, if you explain the needs exactly. In your original question the key was a single row only.
Then:
Match = ismember(temp(:, 1), Search(1, :)) & ...
ismember(temp(:, 2), Search(2, :)) & ...
ismember(cat(1, temp{:, 3}), cat(1, Search{3, :}));
Wasim Aftab
Wasim Aftab am 7 Jul. 2017
Hi Simon, Thank you for your time. You are right, its my mistake not to explain it precisely in the question. But when I write code I try to write as general as possible. That's why I assumed answers to be general. However, your code is still not working. Best Regards, Wasim

Melden Sie sich an, um zu kommentieren.


Andrei Bobrov
Andrei Bobrov am 4 Jul. 2017
find(all(ismember(temp(:,1:2),key(1:2)),2) & ismember([temp{:,3}]',key{3}))
  7 Kommentare
Andrei Bobrov
Andrei Bobrov am 26 Sep. 2017
[l,ii] = ismember(temp,key,'rows');
Wasim Aftab
Wasim Aftab am 2 Feb. 2018
Bearbeitet: Wasim Aftab am 2 Feb. 2018
it's not correct implementation. for each row of key found in temp, its index in temp should be recorded, so the output will be an one-dimensional vector. but in your case ii is 2d.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by