更多的方法来找到匹配数据
今天在新闻组,用户想要帮助寻找在一个矩阵值匹配(参见其他值帖子)。已经解决了我阅读的时候,但是关于这个问题的东西一直在唠叨我。所以我花一点时间思考更多的问题。
内容
样本数据
这是样本数据,用户想要找到所有的地方一个的值相匹配的值B。简单语句。
A = [11 22 34 56 89 23 44 11 89 66 79 54 32 17 11 66 21 45 90] B = [11 66 44 40 90]
= 11 22 34 56 89 23 44 11 89 66 79 54 32 17 11 66 21 45 90 B = 11 66 44 40 90
布鲁诺的解决方案——列解决方案
就像我说的,当我阅读已经有解决方案。在这儿。
结果= 0(大小(A));为i = 1:尺寸(B, 2)结果=结果+ (A = = B(我));结束结果
结果= 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1
这里的想法是创建正确的大小输出,并通过中的值周期B(较小的数组为用户的例子)。查看给定值的地方B匹配一个一个,并添加一个1结果当这些被发现。
找到准确位置匹配
说实话,一开始我误解了问题,并想出了下面的代码。然而,它确实不所解决问题!
C = ~ (A-repmat (B、大小(A, 1), 1))
C = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1
我试着解决方案的原因repmat首先我能得到正确答案,然后找到解决的办法而不是bsxfun。相反,这个解决方案(可以是相当昂贵的repmat)看起来在特定的列位置匹配值。换句话说,错误的问题解决了。
发现存在的一点——行操作的解决方案
已经量很小,我是解决错误的问题,我下一个尝试找到匹配的行一个。
Z = 0(大小(A));为k = 1:尺寸(1)Z (k,:) = ismember ((k,:), B);结束Z
Z = 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1
至少这一次我得到正确的答案和解决的问题是正确的!但这通常需要更长的时间比布鲁诺的方法,因为用户的前提是一个是巨大的和B不近如此之大。
isequal (Z,结果)
ans = 1
我试过这种方法的原因是然后看看是否可以把它转换成使用的东西arrayfun,或者cellfun。
另一个解决方案
最后我有一些咖啡不过!谢天谢地。答案是在我的面前。我已经使用它:ismember。
FinalAnswer = ismember (A, B)
FinalAnswer = 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1
isequal (FinalAnswer,结果)
ans = 1
一举我可以计算整个结果因为我不在乎匹配这些位置。这足以说中的一个值一个匹配的一些价值B。瞧!
其他方法
我只是向您展示了一些方法来解决这个问题。你有类似的问题,也许是那些不产生简单的解决方案?或者你有其他的方法来解决这个问题,可能是有用的,特别是在更复杂的情况?请分享在这里。