В этом примере показано, как реализовать эффективное оборудованием разложение Q-less QR с помощью Действительного Пакета блок Q-less QR Decomposition.
Действительный Пакет блок Q-less QR Decomposition выполняет первый шаг решения матричного уравнения A'AX = B, который преобразовывает оперативное к верхне-треугольному R, затем решает преобразованную систему R'RX = B, где R'R = A'A.
Задайте количество строк и столбцов в матрице А.
m = 5; % Number of rows in matrix A n = 3; % Number of columns in matrix A
Используйте функцию помощника realUniformRandomArray чтобы сгенерировать случайную матрицу А, таким образом, что элементы массива между-1 и +1, и A является полным рангом.
rng('default')
A = fixed.example.realUniformRandomArray(-1,1,m,n);
Используйте функцию помощника qlessqrFixedpointTypes чтобы выбрать типы данных с фиксированной точкой для матрицы А, которые гарантируют, никакое переполнение не произойдет в преобразовании оперативного к R. Для получения дополнительной информации о том, как типы данных выбраны, см. документ FixedPointMatrixLibraryDatatypesExample.pdf в текущем каталоге.
max_abs_A = 1; % max(abs(A(:)) f = 24; % Fraction length (bits of precision) T = fixed.example.qlessqrFixedpointTypes(m,max_abs_A,f); A = cast(A,'like',T.A);
model = 'RealBurstQlessQRModel';
open_system(model);

Подсистема Обработчика Данных в этой модели берет действительную матрицу А в качестве входа. ready порт инициировал Обработчик Данных. После отправки истинного validIn сигнал, перед ready может быть некоторая задержка установлен в ложь. Когда Обработчик Данных обнаруживает передний край ready сигнал, блок устанавливает validIn к истине и отправляет следующую строку A. Этот протокол позволяет данным быть отправленными каждый раз, когда передний край ready сигнал обнаруживается, гарантируя, что все данные обрабатываются.
Используйте функцию помощника setModelWorkspace добавить переменные, заданные выше к рабочему пространству модели. Эти переменные соответствуют параметрам блоков для Действительного Пакета блок Q-less QR Decomposition.
numSamples = 1; % Number of sample matrices fixed.example.setModelWorkspace(model,'A',A,'m',m,'n',n,... 'numSamples',numSamples);
out = sim(model);
Действительный Пакет блок Q-less QR Decomposition выходные данные одна строка за один раз. Когда строка результата выводится, блок устанавливает validOut к истине. Строки матрицы R выводятся в обратном порядке, чтобы вместить заднюю замену, таким образом, необходимо восстановить данные, чтобы интерпретировать результаты. Чтобы восстановить матрицу R от выходных данных, используйте функцию помощника qlessqrModelOutputToArray.
R = fixed.example.qlessqrModelOutputToArray(out.R,m,n,numSamples);
R является верхней треугольной матрицей.
R
R =
1.5379 0.0432 -0.1395
0 1.5978 0.4742
0 0 1.5192
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 28
FractionLength: 24
isequal(R,triu(R))
ans = logical 1
Чтобы оценить точность Действительного Пакета блок Q-less QR Decomposition, вычислите относительную погрешность.
relative_error = norm(double(R'*R - A'*A))/norm(double(A'*A))
relative_error = 8.2641e-07
Подавите mlint предупреждения.
%#ok<*NOPTS>