罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经退休,不会被更新。

更多的方法来找到匹配数据

今天在新闻组,用户想要帮助寻找在一个矩阵值匹配(参见其他值帖子)。已经解决了我阅读的时候,但是关于这个问题的东西一直在唠叨我。所以我花一点时间思考更多的问题。

内容

样本数据

这是样本数据,用户想要找到所有的地方一个的值相匹配的值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。瞧!

其他方法

我只是向您展示了一些方法来解决这个问题。你有类似的问题,也许是那些不产生简单的解决方案?或者你有其他的方法来解决这个问题,可能是有用的,特别是在更复杂的情况?请分享在这里




使用MATLAB®7.7发表

|