2013-10-07 28 views
3

我想找到一種更有效的方式來找到除了使用'for'循環以外的cellarray中的數組索引。我的問題如下:在matlab中查找cellarray中的值(數組)

a = [6,3] 
b = {[1,10];[1,8,10];[8,10];[2,8];2;[2,4,5];[2,4];[];[3,6];[3,4,6];6;[3,5,6];[6,9];[1,6,9];[1,6,7,9]} 

我需要在'b'中找到'a'的索引。我現在的方法是有效的,但是當你增加'b'的大小時是非常緩慢和麻煩的,這是我的情況。我對數組的順序不感興趣,只是內容相同,這就是爲什麼我使用'setxor'方法。下面的代碼顯示了我目前如何執行此操作的示例。

for num = 1:size(b,1)  
    new_array(num,1) = isempty(setxor(a, b{num,1})); 
    if (new_array(num,1) == 1) 
     indexOfArray = num; 
     break; 
    end; 
end; 

有沒有更好的方法來做到這一點? 由於提前, 文森特

+3

你對'內容是一樣的'是什麼意思?與[[1 1 1 2]]相同嗎?否則,您可能需要先對它們進行排序,然後檢查完​​全相等。 –

+0

不,這兩個數組具有相同的值但內容不相同。我的意思是,[1 2 3],[1,3,2],[3,2,1]等所有內容都是相同的,但順序不盡相同。 – vincent

回答

5

這很容易與cellfun

find(cellfun(@(x) isempty(setxor(a,x)), b)) 

如果你只想要第一個巧合,使用

find(cellfun(@(x) isempty(setxor(a,x)), b), 1) 

,它使用了巧合的定義,在setxor條款。

感謝@Dan和@DennisJaheruddin的建設性意見,這些意見已被納入本答案。

+1

大概堅持用'isempty(setxor(a,x))'在'isequal'上' – Dan

+1

@Dan好吧,我測試了一下,'isequal'似乎更快了 –

+0

但是它不起作用,因爲OP想要匹配[6,3]到[3,6] ... – Dan