В этом примере показано, как использовать 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>