約1000行と1000列の2つの大きな配列があります。これらの配列の各要素を比較し、対応する要素が等しい場合は1を別の配列に保存する必要があります。
Forループでこれを実行できますが、時間がかかります。どうすればもっと速くできますか?
与えられた答えはすべて正しいです。 gnovice's 浮動小数点テストについての説明について詳しく説明したかっただけです。
浮動小数点数が等しいかどうかを比較する場合、許容値を使用する必要があります。 2つのタイプの公差比較が一般的に使用されます:絶対公差と相対公差。 ( ソース )
a
とb
の絶対許容差の比較は次のようになります。
|a-b| < tol
相対公差の比較は次のようになります。
|a-b| < tol*max(|a|,|b|) + tol_floor
上記の2つを匿名関数として実装できます。
%# absolute tolerance equality
isequalAbs = @(x,y,tol) ( abs(x-y) <= tol );
%# relative tolerance equality
isequalRel = @(x,y,tol) ( abs(x-y) <= ( tol*max(abs(x),abs(y)) + eps) );
次に、それらを次のように使用できます。
%# let x and y be scalars/vectors/matrices of same size
x == y
isequalAbs(x, y, 1e-6)
isequalRel(x, y, 1e-6)
2つの行列A
とB
が同じサイズである場合、これを行うことができます。
index = A == B;
およびindex
は、 論理配列 になり、A
とB
の要素が等しい場合はすべて1、その他の場合はゼロになります。
警告の言葉...
A
とB
に整数が含まれる場合、上記で問題ありません。ただし、浮動小数点値が含まれている場合、望ましくない結果が得られる可能性があります。上記のコードは、exactly等しい要素に対してのみ1の値を持ちます。わずかな違いでも、要素は等しくないと見なされます。
「浮動小数点演算の危険」に対処するための詳細については、 この質問の答え をご覧ください。解決策の1つは、次のように、配列要素が互いの許容範囲内にあることを確認することです。
tolerance = 0.0001;
index = abs(A-B) <= tolerance;
上記は、index
とA
の要素が相互に0.0001以内で、それ以外の場合はゼロである論理配列B
を提供します。
通常の==
演算子:
>> [1 2; 3 4] == [1 5; 6 4]
ans =
1 0
0 1