在Matlab中查找单元数组(cell array)中的值(数组)

3

我正在寻找一种比使用“for”循环更有效的方法,来查找一个数组在细胞数组中的索引。我的问题如下:

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;

有没有更好的方法来做这件事? 提前谢谢, Vincent


3
“contents are the same”是指内容相同。[1 1 1 1 2][2 1]不相同,您可能需要先将它们排序,然后再检查是否完全相等。 - Dennis Jaheruddin
不,这两个数组具有相同的值但内容不同。我的意思是在[1 2 3]、[1,3,2]、[3,2,1]等意义上,它们都具有相同的内容,尽管顺序不同。 - vincent
1个回答

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 似乎更快。 - Luis Mendo
1
“第一次”的添加不是必需的,因为它是默认设置。 - Dennis Jaheruddin
@LuisMendo 你可以使用 sort(a) 并且仍然具有良好的性能。但这可能不是一个通用的解决方案。根据示例数据,它看起来确实是这样。 - Dan
1
你说你想要匹配ab,而不考虑顺序。然而,如果b中的每个向量都是有序的,就像你的例子一样,你可以在开始时对a进行排序(a = sort(a)),然后使用isequal(a,x)代替isempty(setxor(a,x))。这将节省时间。 - Luis Mendo
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接