В этом примере показано, как реализовать эффективное оборудованием разложение 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
Используйте функцию помощника complexUniformRandomArray
чтобы сгенерировать случайную матрицу А, таким образом, что действительные и мнимые части элементов массива между-1 и +1, и A является полным рангом.
rng('default')
A = fixed.example.complexUniformRandomArray(-1,1,m,n);
Используйте функцию помощника qlessqrFixedpointTypes
чтобы выбрать типы данных с фиксированной точкой для матрицы А, которые гарантируют, никакое переполнение не произойдет в преобразовании оперативного к R.
Действительные и мнимые части элементов массива между-1 и 1, таким образом, максимальное возможное абсолютное значение любого элемента является sqrt (2).
max_abs_A = sqrt(2); % Upper bound on max(abs(A(:)) precisionBits = 24; % Number of bits of precision T = fixed.qlessqrFixedpointTypes(m,max_abs_A,precisionBits); A = cast(A,'like',T.A);
model = 'ComplexBurstQlessQRModel';
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 = 2.1863 + 0.0000i 0.6427 - 1.0882i -0.5771 - 0.3089i 0.0000 + 0.0000i 1.8126 + 0.0000i 0.2095 + 0.0599i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.7760 + 0.0000i 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 = 1.3472e-06
Подавите mlint предупреждения.
%#ok<*NOPTS>