find a row in a multidimensional cell array

2 ビュー (過去 30 日間)
Wasim Aftab
Wasim Aftab 2017 年 7 月 4 日
編集済み: Wasim Aftab 2018 年 2 月 2 日
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 件のコメント
Wasim Aftab
Wasim Aftab 2017 年 9 月 26 日
編集済み: Wasim Aftab 2017 年 9 月 26 日
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

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

採用された回答

the cyclist
the cyclist 2017 年 7 月 4 日
編集済み: the cyclist 2017 年 7 月 4 日
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 件のコメント
Wasim Aftab
Wasim Aftab 2017 年 7 月 5 日
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 2017 年 9 月 26 日
編集済み: Wasim Aftab 2017 年 9 月 26 日
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

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

その他の回答 (2 件)

Jan
Jan 2017 年 7 月 4 日
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 件のコメント
Jan
Jan 2017 年 7 月 5 日
@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 2017 年 7 月 7 日
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

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


Andrei Bobrov
Andrei Bobrov 2017 年 7 月 4 日
find(all(ismember(temp(:,1:2),key(1:2)),2) & ismember([temp{:,3}]',key{3}))
  7 件のコメント
Andrei Bobrov
Andrei Bobrov 2017 年 9 月 26 日
[l,ii] = ismember(temp,key,'rows');
Wasim Aftab
Wasim Aftab 2018 年 2 月 2 日
編集済み: Wasim Aftab 2018 年 2 月 2 日
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.

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

カテゴリ

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