1

次の例を検討してください。

Bathymetry = [0,4134066;
    3,3817906;
    6,3343666;
    9,2978725;
    12,2742092;
    14,2584337;
    16,2415355;
    18,2228054;
    20,2040753;
    23,1761373;
    26,1514085];

Depth = [0;1;2;3;5;8;10;11.6;15];

newDepth = min(Bathymetry(:,1)):0.1:max(Bathymetry(:,1));

これから、「newDepth」のどの列が「Depth」に対応するかを見つけたいと思います。例えば:

dd = find(newDepth==Depth(1))
dd =

     1

Depth == 0 が newDepth の最初の列にあることを示しています。これを「深さ」のすべてのエントリに適用すると

for i = 1:length(Depth);
    dd(i) = find(newDepth == Depth(i));
end

エラーが表示されます:

Improper assignment with rectangular empty matrix.

最初は理由がわかりませんでしたが、newDepth の配列、特に newDepth == 11.6 の列 117 を見ると、値が 11.6 ではなく 11.600000000000001 に等しく、Depth(8) とは異なることに気付きました。どうすればこれを修正できますか? また、なぜ MATLAB は値を 11.6 として書き込まないのでしょうか? .000000000000001を含めるように指定した場所はどこにもありません。

4

3 に答える 3

0

この問題は、非常に複雑な浮動小数点演算に関係しています。グーグルで少し読んでみることをお勧めします。説明はたくさんあります。これが良いスタートです:http://blogs.mathworks.com/loren/2006/08/23/a-glimpse-into-floating-point-accuracy/

あなたのケースのためにそれを解決するために、私は丸めることを提案します

newDepth = round(newDepth * 10) / 10
于 2012-11-16T10:11:53.723 に答える
0

これは、2 進数で 0.1 の正確な表現がないためです。背景についてはウィキを読んでください。2 進数では、表現0.1とは、3 分の 1 のすべての小数を書き出そうとするようなものです。

1/3 == 0.333333333333333333...

をいくつ追加しても、正確にはなりません3

この(および他の多くの)理由から、使用しないことをお勧めします==(これは非常に厳しい要求です)。

for ii = 1:length(Depth);
    [~,dd(ii)] = min( abs(newDepth-Depth(ii)) );
end
于 2012-11-16T10:20:04.280 に答える
0

11.600000000000001 は、数値 11.6 が 2 進浮動小数点表記で正確に表現できないためです。これは、Matlab の制限ではなく、ハードウェアの動作方法に関係しています。

比較を次のようなものに変更したい

dd(i) = find(abs(newDepth - Depth(i))<.0000001);
于 2012-11-16T10:19:14.730 に答える