2010-03-14 51 views
7

任何人都可以告诉我,如果有一种方法(在MATLAB中)检查某个值是否等于存储在另一个数组中的任何值?寻找一个值是否等于MATLAB中任何数组元素的值

我打算使用它的方法是检查一个矩阵中的元素索引是否等于另一个数组中存储的值(其中存储的值是满足特定条件的元素的索引)。

因此,如果满足条件的元素的索引被存储在下面的矩阵:

criteriacheck = [3 5 6 8 20]; 

通过主阵列参加(称为array)和检查如果索引匹配:

for i = 1:numel(array) 
    if i == 'Any value stored in criteriacheck' 
    %# "Do this" 
    end 
end 

有没有人有我如何去做这件事的想法?

回答

3

,你可以使用find命令

if (~isempty(find(criteriacheck == i))) 
    % do something 
end 
19

优秀answer previously given by @woodchips在这里也适用:

很多方法可以做到这一点。 ismember是第一个想到的,因为它是你想要采取的一套会员制行动。因此,

X = primes(20); 
ismember([15 17],X) 
ans = 
     0 1 

由于15不是素数,而是17,因此ismember在这里做得很好。

当然,找到(或任何)也将工作。但是,这些都不是矢量化的,因为它是成员。我们可以测试15是否在X表示的集合中,但要测试这两个数字将需要一个循环或者连续的测试。

~isempty(find(X == 15)) 
~isempty(find(X == 17)) 

,或者

any(X == 15) 
any(X == 17) 

最后,我想指出的是,对于精确值测试是危险的,如果这些数字可能是真实的浮动。按照我所显示的对整数值进行测试很容易。但是对浮点数的测试通常应该使用一个容差。

tol = 10*eps; 
any(abs(X - 3.1415926535897932384) <= tol) 
3

注:虽然这个答案并没有在标题解决的问题,它解决了与你是如何设计你的for循环(这阻却具有解决你是什么一个更基本的问题在标题中询问)。 ;)

根据你写的for循环,你的数组criteriacheck看起来是一组索引到array,并且对于每个这些索引元素你都要做一些计算。如果是这样的话,这里是为您设计您的for循环的替代方法:

for i = criteriacheck 
    %# Do something with array(i) 
end 

这将循环遍历criteriacheck所有的值,设定i到每个后续值(即3,5,6,8,在你的例子中为20)。这比遍历每个元素array并检查索引是否在criteriacheck中更紧凑和高效。

NOTE:正如Jonas指出的那样,您要确保criteriacheck是for循环正常工作的行向量。您可以通过与(:)'语法如下它,这reshapes it into a column vector然后transposes it入行向量形成任何矩阵为行向量:

for i = criteriacheck(:)' 
... 
+1

请注意,criteriacheck需要是行向量,即[3,5,6 ...],而不是[3; 5; 6 ...]。为了安全起见,我会写<< for i = criteriacheck(:)'>>。无论如何,+1 – Jonas 2010-03-16 23:36:11

+0

@Jonas:好主意,为了安全起见。 ;) – gnovice 2010-03-17 02:44:52

1

原来的问题:“谁能告诉我,如果有一种方法(在MATLAB )来检查某个值是否等于存储在另一个数组中的任何值?“可以解决没有任何循环。

只需使用setdiff函数。

0

我觉得INTERSECT功能就是你要找的。

C =相交(A,B)返回A和B共有的值。C的 值按排序顺序排列。

http://www.mathworks.de/de/help/matlab/ref/intersect.html

问题if i == 'Any value stored in criteriacheck还可以,如果你考虑i一个微不足道的矩阵回答了这个方式。但是,您可以更好地使用any(i==criteriacheck)

相关问题