В этом примере показано, как использовать fixed.qlessqrFixedpointTypes аналитически определить фиксированную точку для расчета разложения Q-less QR.
Задайте количество строк и столбцов в матрице .
m = 10; % Number of rows in matrix A n = 3; % Number of columns in matrix A
Используйте функцию помощника realUniformRandomArray сгенерировать случайную матрицу таким образом, что элементы между и .
rng('default')
A = fixed.example.realUniformRandomArray(-1,1,m,n);Используйте fixed.qlessqrFixedpointTypes функционируйте, чтобы выбрать тип данных с фиксированной точкой для матрицы это гарантирует, что никакое переполнение не произойдет в преобразовании оперативный к .
max_abs_A = 1; % Upper bound on max(abs(A(:)) precisionBits = 24; % Number of bits of precision T = fixed.qlessqrFixedpointTypes(m,max_abs_A,precisionBits)
T = struct with fields:
A: [0x0 embedded.fi]
T.A тип, вычисленный для преобразования к оперативный так, чтобы это не переполнялось.
T.A
ans =
[]
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 28
FractionLength: 24
Бросьте вход к типу, определенному fixed.qlessqrFixedpointTypes.
A = cast(A,'like',T.A);Ускорьте fixed.qlessQR при помощи fiaccel сгенерировать исполняемый файл MATLAB (MEX) функция.
fiaccel fixed.qlessQR -args {A} -o qlessQR_mex
Вычислите разложение QR.
R = qlessQR_mex(A);
верхняя треугольная матрица.
R
R =
2.2180 0.8559 -0.5607
0 2.0578 -0.4017
0 0 1.7117
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 28
FractionLength: 24
isequal(R,triu(R))
ans = logical
1
Оценивать точность fixed.qlessQR функционируйте, вычислите относительную погрешность.
, и является ортогональным, таким образом, , в погрешности округления.
relative_error = norm(double(R'*R - A'*A))/norm(double(A'*A))
relative_error = 9.0961e-07
Подавите mlint предупреждения.
%#ok<*NOPTS>