В этом примере показано, как выполнять арифметическую и линейную алгебру с данными одной точности. Он также показывает, как результаты вычисляются соответствующим образом с одинарной или двойной точностью, в зависимости от входных данных.
Сначала создадим данные, которые по умолчанию имеют двойную точность.
Ad = [1 2 0; 2 5 -1; 4 10 -1]
Ad = 3×3
1 2 0
2 5 -1
4 10 -1
Мы можем преобразовать данные в одну точность с помощью single функция.
A = single(Ad); % or A = cast(Ad,'single');Мы также можем создать нули единой точности и единицы с их соответствующими функциями.
n = 1000; Z = zeros(n,1,'single'); O = ones(n,1,'single');
Рассмотрим переменные в рабочей области.
whos A Ad O Z n
Name Size Bytes Class Attributes A 3x3 36 single Ad 3x3 72 double O 1000x1 4000 single Z 1000x1 4000 single n 1x1 8 double
Мы видим, что некоторые переменные имеют тип single и что переменная A (версия с одной точностью Ad) занимает половину количества байтов памяти, потому что для одиночных файлов требуется всего четыре байта (32 бита), в то время как для двойных файлов требуется 8 байтов (64 бита).
Мы можем выполнять стандартную арифметику и линейную алгебру на одиночках.
B = A' % Matrix TransposeB = 3x3 single matrix
1 2 4
2 5 10
0 -1 -1
whos BName Size Bytes Class Attributes B 3x3 36 single
Мы видим результат этой операции, B, является одиночкой.
C = A * B % Matrix multiplicationC = 3x3 single matrix
5 12 24
12 30 59
24 59 117
C = A .* B % Elementwise arithmeticC = 3x3 single matrix
1 4 0
4 25 -10
0 -10 1
X = inv(A) % Matrix inverseX = 3x3 single matrix
5 2 -2
-2 -1 1
0 -2 1
I = inv(A) * A % Confirm result is identity matrixI = 3x3 single matrix
1 0 0
0 1 0
0 0 1
I = A \ A % Better way to do matrix division than invI = 3x3 single matrix
1 0 0
0 1 0
0 0 1
E = eig(A) % EigenvaluesE = 3x1 single column vector
3.7321
0.2679
1.0000
F = fft(A(:,1)) % FFTF = 3x1 single column vector
7.0000 + 0.0000i
-2.0000 + 1.7321i
-2.0000 - 1.7321i
S = svd(A) % Singular value decompositionS = 3x1 single column vector
12.3171
0.5149
0.1577
P = round(poly(A)) % The characteristic polynomial of a matrixP = 1x4 single row vector
1 -5 5 -1
R = roots(P) % Roots of a polynomialR = 3x1 single column vector
3.7321
1.0000
0.2679
Q = conv(P,P) % Convolve two vectorsQ = 1x7 single row vector
1 -10 35 -52 35 -10 1
R = conv(P,Q)
R = 1x10 single row vector
1 -15 90 -278 480 -480 278 -90 15 -1
stem(R); % Plot the result
Теперь рассмотрим функцию, чтобы вычислить достаточное количество членов в последовательности Фибоначчи, чтобы отношение было меньше, чем правильный машинный эпсилон (eps) для типа данных «один» или «двойной».
% How many terms needed to get single precision results? fibodemo('single')
ans = 19
% How many terms needed to get double precision results? fibodemo('double')
ans = 41
% Now let's look at the working code. type fibodemo
function nterms = fibodemo(dtype) %FIBODEMO Used by SINGLEMATH demo. % Calculate number of terms in Fibonacci sequence. % Copyright 1984-2014 The MathWorks, Inc. fcurrent = ones(dtype); fnext = fcurrent; goldenMean = (ones(dtype)+sqrt(5))/2; tol = eps(goldenMean); nterms = 2; while abs(fnext/fcurrent - goldenMean) >= tol nterms = nterms + 1; temp = fnext; fnext = fnext + fcurrent; fcurrent = temp; end
Обратите внимание, что мы инициализируем несколько наших переменных, fcurrent, fnext, и goldenMean, со значениями, зависящими от типа входных данных, и допуском tol зависит и от этого типа. Единичная точность требует, чтобы мы рассчитали меньшее количество членов, чем эквивалентное вычисление двойной точности.