Реализуйте эффективное оборудованием комплексное частично-систолическое разложение Q-less QR

В этом примере показано, как реализовать эффективное оборудованием разложение Q-less QR с помощью Комплексного Частично-систолического блока Q-less QR Decomposition.

Размер экономики разложение Q-less QR

Комплексный Частично-систолический блок 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);

Выберите Fixed-Point Data Types

Используйте функцию помощника 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 = 'ComplexPartialSystolicQlessQRModel';
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);

Создайте решение из выходных данных

Блок Complex Partial-Systolic QR Decomposition выходная матрица R на каждом временном шаге. Когда допустимая матрица результата выводится, блок устанавливает validOut к истине.

R = out.R;

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 =

   8.4297e-07

Подавите mlint предупреждения.

%#ok<*NOPTS>