【发布时间】:2014-07-14 21:04:13
【问题描述】:
假设我有一个 7*3 矩阵 t。
>> t=[2,1,3;5,1,9;4,6,1;1,4,6;7,1,5;1,7,4;9,7,5]
t =
2 1 3
5 1 9
4 6 1
1 4 6
7 1 5
1 7 4
9 7 5
还有一个像这样有两个值的数组
e=[2,1]
e =
2 1
我需要知道 t 中哪一行的值是 1 和 2(即矩阵 e 的值)。 即,给定一个函数 match(e,t),它应该返回满足这一点的行号。
我写了一个函数匹配,它完成了这项工作。
function [ faceindex ] = match(e,t)
c=ismember(t,e)
d=sum(c,2)
faceindex=find(d==2)
end
这就是它的工作原理:
匹配(e,t)
c =
1 1 0
0 1 0
0 0 1
1 0 0
0 1 0
1 0 0
0 0 0
d =
2
1
1
1
1
1
0
人脸指数 =
1
ans =
1
但是,我将它用于相当大的输入,并且它被调用了很多次,并且需要一段时间才能运行。 Matlab 的分析器向我展示了这个 ismember 函数的问题。有什么方法可以更快地进行匹配吗?我对任何类型的解决方案或提示持开放态度。也许不必使用 ismember 来进行检查。请注意,顺序无关紧要。如果 e 是 2,1...该行应该有 1 和 2 并且可以是任意顺序。
【问题讨论】:
-
e的大小有变化吗?
-
如果
e变成[1 2 7],faceindex=find(d==2)不会变成faceindex=find(d==3)吗? -
不,e 的大小没有变化。它总是只有两个值,所以我只检查 faceindex=find(d==2)
-
@TinaMaria 如果
t的一排有两个1s 而没有2怎么办?这应该计入faceindex吗? -
@Divakar :我想我应该更具体一些。如果我不够清楚,我真的很抱歉。好吧,t 永远不会有重复的值……所以它永远不会有两个 1,也不会有 2。
标签: arrays performance matlab matrix indexing