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