web-dev-qa-db-ja.com

「行列に値Xが含まれていますか?」

行列に特定の値が含まれているかどうかを調べるための組み込みのMATLAB関数はありますか? (ala PHPのin_array()

69
zenna

これを行う多くの方法。 ismemberは、最初に頭に浮かぶものです。これは、設定するメンバーシップアクションであるためです。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example

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

15は素数ではありませんが、17は素数であるため、ismemberはここでうまく機能しています。

もちろん、find(またはany)も機能します。しかし、これらは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)
99
user85109

できるよ:

A = randi(10, [3 4]);      %# a random matrix
any( A(:)==5 )             %# does A contain 5?

上記をvectorizedの方法で行うには、次を使用します:

any( bsxfun(@eq, A(:), [5 7 11] )

または @ woodchips が示唆するとおり:

ismember([5 7 11], A)
11
Amro

あるベクトルの要素が別のベクトルにあるかどうかを確認する必要がある場合、他の回答で述べたように、最良の解決策はismemberです。

ismember([15 17],primes(20))

ただし、浮動小数点数を扱っている場合、または厳密に一致させたい場合(+-1000も可能)、私が見つけた最良の解決策はかなり効率的です ファイル交換提出:ismemberf

非常に実用的な例を示します。

[tf, loc]=ismember(0.3, 0:0.1:1) % returns false 
[tf, loc]=ismemberf(0.3, 0:0.1:1) % returns true

通常はデフォルトの許容範囲で十分ですが、柔軟性が向上します

ismemberf(9.99, 0:10:100) % returns false
ismemberf(9.99, 0:10:100,'tol',0.05) % returns true
3

浮動小数点データの場合は、新しい ismembertol function を使用できます。これは、セットメンバーシップを計算します指定された許容誤差。これは、ファイル交換にあるismemberf関数と似ていますが、現在はMATLABに組み込まれています。例:

>> pi_estimate = 3.14159;
>> abs(pi_estimate - pi)
ans =
   5.3590e-08
>> tol = 1e-7;
>> ismembertol(pi,pi_estimate,tol)
ans =
     1
2
chappjc