3

Matlab で画像の精度を失うことなく、計算でこの有理数を使用したいと考えています。

f = 359.0 + 16241/16250.0

f = uint64(359.0 + 16241/16250.0)たとえば、Matlab で 360 として表示される精度を失うことによって、保存すると思います。

物事を処理する最良の方法は、値を保存するのではなく、その要素を次のように保存することだと思います

% f = a + b/c
a = 359
b = 16241
c = 16250

次に、変数 a、b、c による計算を行い、結果を画像として提供します。

これは精度を維持するための良い方法ですか?

4

4 に答える 4

6

おそらく、Rationalクラスを作成し、必要な操作 ( plusminustimesなど) を定義します。次のようなものから始めます。

Rational.m

classdef Rational
    properties
        n;
        d;
    end
    methods
        function obj = Rational(n,d)
            GCD = gcd(n,d);
            obj.n = n./GCD;
            obj.d = d./GCD;
        end

        function d = dec(obj)
            d = double(obj.n)/double(obj.d);
        end

        % X .* Y
        function R = times(X,Y)
            chkxy(X,Y);
            if isnumeric(X),
                N = X .* Y.n; D = Y.d;
            elseif isnumeric(Y),
                N = X.n .* Y; D = X.d;
            else
                N = X.n .* Y.n; D = X.d .* Y.d;
            end
            R = Rational(N,D);
        end

        % X * Y
        function R = mtimes(X,Y)
            R = times(X,Y);
        end

        % X ./ Y
        function R = rdivide(X,Y)
            if isnumeric(Y),
                y = Rational(1,Y);
            else
                y = Rational(Y.d,Y.n);
            end
            R = times(X,y);
        end

        % X / Y
        function R = mrdivide(X,Y)
            R = rdivide(X,Y);
        end

        % X + Y
        function R = plus(X,Y)
            chkxy(X,Y);
            if isnumeric(X),
                N = X.*Y.d + Y.n; D = Y.d;
            elseif isnumeric(Y),
                N = Y.*X.d + X.n; D = X.d;
            else
                D = lcm(X.d,Y.d);
                N = sum([X.n Y.n].*(D./[X.d Y.d]));
            end
            R = Rational(N,D);
        end

        % X - Y
        function R = minus(X,Y)
            R = plus(X,-Y);
        end

        % -X
        function R = uminus(X)
            R = Rational(-X.n,X.d);
        end

        function chkxy(X,Y)
            if (~isa(X, 'Rational') && ~isnumeric(X)) || ...
                    (~isa(Y, 'Rational') && ~isnumeric(Y)),
                error('X and Y must be Rational or numeric.');
            end
        end
    end
end

オブジェクトを構築します。

>> clear all % reset class definition
>> r1 = Rational(int64(1),int64(2))
r1 = 
  Rational with properties:

    n: 1
    d: 2
>> r2 = Rational(int64(3),int64(4))
r2 = 
  Rational with properties:

    n: 3
    d: 4

加算および減算:

>> r1+r2
ans = 
  Rational with properties:

    n: 5
    d: 4
>> r1-r2
ans = 
  Rational with properties:

    n: -1
    d: 4

掛け算と割り算:

>> r1*r2
ans = 
  Rational with properties:

    n: 3
    d: 8
>> r1/r2
ans = 
  Rational with properties:

    n: 2
    d: 3

10 進数値を取得します。

>> r12 = r1/r2; % 2/3 ((1/2)/(3/4))
>> f = r12.dec
f =
    0.6667
于 2014-01-01T21:39:12.227 に答える
0

LuisMendoの答えへの拡張

pyによるあなたの提案のエラーとしてこれを得ました

>>> a = 638.08240465923757600307902117159072301901656248436059
>>> a
638.0824046592376             % do not know if Python is computing here with exact number
>>> b = 638.0824
>>> ave = abs(b+a)/2
>>> diff = abs(b-a)
>>> ave = abs(b+a)/2
>>> diff/ave
7.30193709165014e-09

これは、上記の提案されたエラー保存エラーよりも大きいです。

WolframAlphaで実行しています

x = sqrt(pi)
x*5849991/16250

そして得る

509.11609919757198016211937362635174599076143654820109

これがあなたの答えのコメントであなたが意図したものであるかどうかはわかりません。

于 2014-01-01T21:51:11.303 に答える
0

chappjcの回答への拡張。

私が今持っています

[B,T,F] = tfrwv(data1, 1:length(data1), length(data1)); % here F double
fs = Rational(uint64(5849991), uint64(16250));
t = 1/fs;
imagesc(T*t, F*fs, B); 

私はそれを実行します

Error using  .* 
Integers can only be combined with integers of
the same class, or scalar doubles.

Error in  .*  (line 23)
                    N = X .* Y.n; D = Y.d;

Error in  *  (line 34)
                R = times(X,Y);

このクラスで double を Rational で乗算するにはどうすればよいでしょうか?

于 2014-01-01T22:08:53.140 に答える