Perhaps create a Rational class and define the necessary operations ( plus , minus , times , etc.). Start with something like this:
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 .* Yn; D = Yd; elseif isnumeric(Y), N = Xn .* Y; D = Xd; else N = Xn .* Yn; D = Xd .* Yd; 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(Yd,Yn); 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.*Yd + Yn; D = Yd; elseif isnumeric(Y), N = Y.*Xd + Xn; D = Xd; else D = lcm(Xd,Yd); N = sum([Xn Yn].*(D./[Xd Yd])); 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(-Xn,Xd); 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
<strong> Examples
Build Objects:
>> 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
Add and Subtract:
>> r1+r2 ans = Rational with properties: n: 5 d: 4 >> r1-r2 ans = Rational with properties: n: -1 d: 4
Multiply and divide:
>> r1*r2 ans = Rational with properties: n: 3 d: 8 >> r1/r2 ans = Rational with properties: n: 2 d: 3
Get decimal value:
>> r12 = r1/r2; % 2/3 ((1/2)/(3/4)) >> f = r12.dec f = 0.6667