Этот пример показывает, как выполнить арифметическую и линейную алгебру с данными одинарной точности. Это также показывает, как результаты вычисляются соответственно с одной точностью или двойной точностью, в зависимости от входа.
Давайте сначала создадим некоторые данные, что по умолчанию является двойной точностью.
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 Transpose
B = 3x3 single matrix
1 2 4
2 5 10
0 -1 -1
whos B
Name Size Bytes Class Attributes B 3x3 36 single
Мы видим результат этой операции, B
, является синглом.
C = A * B % Matrix multiplication
C = 3x3 single matrix
5 12 24
12 30 59
24 59 117
C = A .* B % Elementwise arithmetic
C = 3x3 single matrix
1 4 0
4 25 -10
0 -10 1
X = inv(A) % Matrix inverse
X = 3x3 single matrix
5 2 -2
-2 -1 1
0 -2 1
I = inv(A) * A % Confirm result is identity matrix
I = 3x3 single matrix
1 0 0
0 1 0
0 0 1
I = A \ A % Better way to do matrix division than inv
I = 3x3 single matrix
1 0 0
0 1 0
0 0 1
E = eig(A) % Eigenvalues
E = 3x1 single column vector
3.7321
0.2679
1.0000
F = fft(A(:,1)) % FFT
F = 3x1 single column vector
7.0000 + 0.0000i
-2.0000 + 1.7321i
-2.0000 - 1.7321i
S = svd(A) % Singular value decomposition
S = 3x1 single column vector
12.3171
0.5149
0.1577
P = round(poly(A)) % The characteristic polynomial of a matrix
P = 1x4 single row vector
1 -5 5 -1
R = roots(P) % Roots of a polynomial
R = 3x1 single column vector
3.7321
1.0000
0.2679
Q = conv(P,P) % Convolve two vectors
Q = 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
) для типа данных single или double.
% 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
зависит и от этого типа. Одинарная точность требует, чтобы мы вычисляли меньше членов, чем эквивалентное вычисление двойной точности.