В этом примере показано, как реализовать эффективное оборудованием разложение 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.
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); A = cast(A,'like',T.A);
model = 'RealPartialSystolicQlessQRModel';
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);
Блок Real Partial-Systolic QR Decomposition выходная матрица R на каждом временном шаге. Когда допустимая матрица результата выводится, блок устанавливает validOut
к истине.
R = out.R;
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>