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

Этот пример показывает, как реализовать аппаратно-эффективное Q-less QR-разложение с помощью блока Complex Burst Q-less QR Decomposition.

Размер экономики Q-less QR-декомпозиция

Блок Complex Burst Q-less QR Decomposition выполняет первый шаг решения матричного уравнения A 'AX = B, которое преобразует A на месте в верхнетреугольную R, затем решает преобразованную систему R' RX = B, где R 'R = A' A.

Задайте матричные размерности

Задайте количество строк и столбцов в матрице А.

m = 5;  % Number of rows in matrix A
n = 3;  % Number of columns in matrix A

Сгенерируйте матрицу А

Используйте функцию helper complexUniformRandomArray сгенерировать случайную матрицу А таким образом, чтобы действительная и мнимая части элементов массива находились между -1 и + 1, а A является полным рангом.

rng('default')
A = fixed.example.complexUniformRandomArray(-1,1,m,n);

Выбор типов данных с фиксированной точкой

Используйте функцию helper qlessqrFixedpointTypes для выбора типов данных с фиксированной точкой для матрицы А, которые гарантируют отсутствие переполнения при преобразовании A на месте в R. Для получения дополнительной информации о том, как выбираются типы данных, см. документ FixedPointMatrixLibraryDatatypesExample.pdf в текущей директории.

Действительная и мнимая части элементов массива находятся между -1 и 1, поэтому максимально возможным абсолютным значением любого элемента является sqrt (2).

max_abs_A = sqrt(2);  % 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 = 'ComplexBurstQlessQRModel';
open_system(model);

Подсистема Обработчика Данных в этой модели принимает за вход сложную матрицу А The ready порт запускает обработчик данных. После отправки истинного validIn сигнал, может быть некоторая задержка перед ready задано значение false. Когда Обработчик данных обнаруживает переднее ребро ready сигнал, блок устанавливает validIn в true и отправляет следующую строку A. Этот протокол позволяет отправлять данные всякий раз, когда переднее ребро ready обнаруживается сигнал, обеспечивающий обработку всех данных.

Установите переменные в рабочем пространстве модели

Используйте функцию helper setModelWorkspace чтобы добавить переменные, определенные выше, в рабочее пространство модели. Эти переменные соответствуют параметрам блоков для блока Complex Burst 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 Burst Q-less QR Decomposition выводит данные по одной строке за раз. Когда выводится строка результата, блок устанавливает validOut к true. Строки матрицы R выводятся в обратном порядке, чтобы включать обратное замещение, поэтому вы должны восстановить данные, чтобы интерпретировать результаты. Чтобы восстановить матрицу R из выхода данных, используйте функцию helper 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

Проверьте точность выхода

Чтобы оценить точность блока Complex Burst Q-less QR Decomposition, вычислите относительную погрешность.

relative_error = norm(double(R'*R - A'*A))/norm(double(A'*A))
relative_error =

   1.3472e-06

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

%#ok<*NOPTS>
Для просмотра документации необходимо авторизоваться на сайте