有人能告诉我是否有办法(在MATLAB中)检查某个值是否等于另一个数组中存储的任何值?
我打算使用它的方法是检查一个矩阵中的元素索引是否等于另一个数组中存储的值(其中存储的值是满足特定条件的元素的索引)。
因此,如果满足标准的元素的索引存储在下面的矩阵中:
criteriacheck = [3 5 6 8 20];
浏览主数组(称为array
)并检查索引是否匹配:
for i = 1:numel(array)
if i == 'Any value stored in criteriacheck'
%# "Do this"
end
end
有没有人知道我怎么会这样做?
答案 0 :(得分: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)
答案 1 :(得分:3)
你可以使用find命令
if (~isempty(find(criteriacheck == i)))
% do something
end
答案 2 :(得分:3)
注意:虽然这个答案没有解决标题中的问题,但它确实解决了你如何设计for循环的一个更基本的问题(其解决方案否定你必须做的事情)标题)。 ;)
根据您编写的for循环,您的数组criteriacheck
似乎是array
的一组索引,并且对于每个索引元素,您想要进行一些计算。如果是这样,这里是您设计for循环的另一种方法:
for i = criteriacheck
%# Do something with array(i)
end
这将循环遍历criteriacheck
中的所有值,将i
设置为每个后续值(例如,示例中为3,5,6,8和20)。这比循环遍历array
的每个元素并检查索引是否在criteriacheck
中更紧凑和高效。
注意:正如Jonas指出的那样,您希望确保criteriacheck
是for循环才能正常运行的行向量。您可以使用(:)'
语法(将reshapes it into a column vector然后transposes it添加到行向量中,将任何矩阵形成为行向量:
for i = criteriacheck(:)'
...
答案 3 :(得分:1)
原始问题“任何人都可以告诉我是否有办法(在MATLAB中)检查某个值是否等于另一个数组中存储的任何值?”可以在没有任何循环的情况下解决。
只需使用setdiff功能。
答案 4 :(得分:0)
我认为INTERSECT功能正是您所需要的。
C = intersect(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)