1

doubleの配列を作成しましたが、findコマンドを使用して配列内の特定の値のインデックスを検索すると、空の行列が生成されますが、これは必要なものではありません。問題は、配列の読み取り値に表示されていない値や小数点以下の桁数の精度にあると思います。

指図:

peaks=find(y1==0.8236)

アレイの読み出し:

y1 =

Columns 1 through 11

0.2000    0.5280    0.8224    0.4820    0.8239    0.4787    0.8235    0.4796    0.8236    0.4794    0.8236

Columns 12 through 20

0.4794    0.8236    0.4794    0.8236    0.4794    0.8236    0.4794    0.8236    0.4794

出力:

peaks =

Empty matrix: 1-by-0

コマンドを使ってみました

format short

しかし、これは表示された値を切り捨てるだけで、配列の実際の値は切り捨てないと思います。

findコマンドを使用してインデックスの配列を指定するにはどうすればよいですか?

4

3 に答える 3

4

デフォルトでは、Matlabの数値行列の各要素は、浮動小数点の倍精度を使用して格納されます。質問を推測しformat shortformat long実際の数値の形式ではなく、表示される形式を変更するだけです。

したがって、y1のようなものを使用して作成され、を使用y1 = rand(100, 1)して特定の要素を検索する場合は、浮動小数点の倍精度で探している要素の正確な値を知る必要があります。これは、アプリケーションによってはおそらく非些細なことです。確かに、次のような値のみが含まれている場合は空行列を返しますy1findpeaks=find(y1==0.8236)y10.823622378...

では、この問題を回避するにはどうすればよいですか?アプリケーションによって異なります。1つのアプローチは、すべての値をy1、作業したい特定の精度に切り捨てることです。おかしなことに、このトピックに関するSO matlabの質問は、約12時間前に2つの良い答えを集めました。詳細については、こちらを参照してください。

このルートを進むことにした場合は、次のようなものをお勧めします。

a = 1e-4 %# Define level of precision
y1Round = round((1/a) * y1); %# Round to appropriate precision, and leave y1 in integer form
Index = find(y1Round == SomeValue); %# Perform the find operation

findコマンドをy1Round整数形式で使用していることに注意してください。これは、浮動小数点doubleを使用すると整数が正確に格納されるため、浮動小数点の精度について心配する必要がないためです。

この問題に対する別のアプローチはfind、エラーをある程度許容して使用することです。たとえば、次のようになります。

Index = find(abs(y1 - SomeValue) < Tolerance);

どのパスを選択するかはあなた次第です。ただし、これらのアプローチのいずれかを採用する前に、アプリケーションをよく調べて、一連の「」の中から特定の「実数」を検索する必要がないように、何らかの方法で再定式化できるかどうかを確認します。実数」。それが最も理想的な結果です。

編集:この質問に対する他の2つの回答で提唱されているコードは、私の2番目のアプローチよりも優れているため、それに応じて変更しました。

于 2012-11-07T00:35:28.580 に答える
3

浮動小数点数との同等性をテストすることは、ほとんどの場合、悪い考えです。おそらく実行したいのは、どの数値が目標値に十分近いかをテストすることです。

peaks = find( abs( y - .8236 ) < .0001 );
于 2012-11-07T00:34:51.713 に答える
2

問題は確かに精度にあります。表示されている配列は実際の配列ではありません。実際の配列には、数値ごとにより多くの桁があるためです。フォーマットを変更すると、配列の表示方法が変わるだけなので、問題は解決しません。

アレイを変更するか、探しているものを変更するかの2つのオプションがあります。実際の値は変更しないので、探しているものを変更する方がおそらく良いでしょう。

したがって、同等性を探す代わりに、近接性を探すことができます(つまり、探している数と配列内の数の差は、せいぜい小さなイプシロンです)。

peaks = find( abs(y1-0.8236) < epsilon )

一般に、浮動小数点数を扱う場合は、正確な比較を避け、いくつかのエラーしきい値を使用するようにしてください。これらの数値の表現は制限されているため、小さな不正確さで格納されることがよくあります。

于 2012-11-07T00:32:29.020 に答える