コロン関数でインクリ​メントした数列から,​一致する要素の検索の​仕方がわかりません

조회 수: 25 (최근 30일)
KENji
KENji 2018년 10월 3일
댓글: KENji 2018년 10월 4일
基礎的な問題なのかもしれませんが,よろしくお願いします.
私は二つの数値配列の中で,一致するインデックスを求めたいのですが,intersect関数を使用すると検知できない数値があります. 以下のコードの場合は,Aと一致する数値をBから20個見つけ出せます.
A=[0.425 0.475 0.525 0.575 0.625 0.675 0.725 0.775 0.825 0.875 0.925 0.975 1.025 1.075 1.125 1.175 1.225 1.275 1.325 1.375];
B=[0.3 0.325 0.35 0.375 0.4 0.425 0.45 0.475 0.5 0.525 0.55 0.575 0.6 0.625 0.65 0.675 0.7 0.725 0.75 0.775 0.8 0.825 0.85 0.875 0.9 0.925 0.95 0.975 1 1.025 1.05 1.075 1.1 1.125 1.15 1.175 1.2 1.225 1.25 1.275 1.3 1.325 1.35 1.375 1.4 1.425];
[G,ia,ib] = intersect(A,B,'stable')
しかし,以下のようなコロン演算子を使用したインクリメントでの配列を作成したものをintersect関数に使用すると,ほとんどは見つけることができますが,見つからないものが出てきます.
C=0.425:0.05:1.375;
D=0.3:0.025:2;
[GG,ic,id] = intersect(C,D,'stable')
上記の場合は,Dの中のCと一致するものを見つけ出したいのですが, icに20個の分のインデックスが返ってくるはずが17個しか見つかりません. C及びDには同じ数値が入っていることは確認済みです.
ismemberやfind関数でも同様になってしまいます. この問題の回避方法はないでしょうか? 宜しくお願い致します。

채택된 답변

Yoshio
Yoshio 2018년 10월 3일
1.175に見えるデータの内部表現を16進表現で見てみると
>> format hex
>> C(16)
ans =
3ff2cccccccccccd
>> D(36)
ans =
3ff2cccccccccccc
となっており、厳密には同一ではありません。
>> C(16) == D(36)
ans =
logical
0
コロン関数では数値演算を行なって要素を計算していますので、浮動小数点での比較は危険です。今の場合、これを回避する一つの方法は、数値をString型にして文字列で比較することです。
[GG,ic,id] = intersect(string(C),string(D),'stable')
GG =
1×20 string 配列
しかし、CやDのデータがより一般的な浮動小数点データの場合、文字列に変換して比較するのではなく、誤差を計算した上で、許容範囲を設定し、その範囲内で一致するものを抜き出すようにした方が良いかと思います。
  댓글 수: 1
KENji
KENji 2018년 10월 4일
お二方とも回答いただき,ありがとうございます. 細かな誤差の比較までは行っていませんでした.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Hirokazu Tanaka
Hirokazu Tanaka 2018년 10월 3일
Yoshioさんのおっしゃる通りです。
R2015aから使える関数ですが、誤算の許容範囲を設定できる関数 ismembertol が便利かと。
C=0.425:0.05:1.375;
D=0.3:0.025:2;
ismembertol(C,D)
と実行すると
ans =
1×20 logical 配列
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
20個の分のインデックスが返ってきます。
詳細はこちら:
調べていたら、unique にも同様の関数がありました。

카테고리

Help CenterFile Exchange에서 集合演算에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!