Эффективная оборудованием комплексная частично-систолическая матрица реализации решает Используя разложение Q-less QR

В этом примере показано, как реализовать аппаратное эффективное решение матричного уравнения A'AX=B с комплексным знаком с помощью Комплексной Частично-систолической Матрицы, Решают Используя блок Q-less QR Decomposition.

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

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

m = 300; % Number of rows in A
n = 10;  % Number of columns in A and rows in B
p = 1;   % Number of columns in B

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

В данном примере используйте функцию помощника complexRandomQlessQRMatrices сгенерировать случайные матрицы A и B для проблемы A'AX=B. Матрицы сгенерированы таким образом, что действительные и мнимые части элементов массива и B между-1 и +1, и A является полным рангом.

rng('default')
[A,B] = fixed.example.complexRandomQlessQRMatrices(m,n,p);

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

Используйте функцию помощника complexQlessQRMatrixSolveFixedpointTypes выбрать типы данных с фиксированной точкой для входных матриц A и B и вывести X таким образом, что существует низкая вероятность переполнения во время расчета.

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

max_abs_A = sqrt(2);  % Upper bound on max(abs(A(:))
max_abs_B = sqrt(2);  % Upper bound on max(abs(B(:))
precisionBits = 24;   % Number of bits of precision
T = fixed.complexQlessQRMatrixSolveFixedpointTypes(m,n,max_abs_A,max_abs_B,precisionBits);
A = cast(A,'like',T.A);
B = cast(B,'like',T.B);
OutputType = fixed.extractNumericType(T.X);

Откройте модель

model = 'ComplexPartialSystolicQlessQRMatrixSolveModel';
open_system(model);

Подсистема Обработчика Данных в этой модели берет комплексные матрицы A и B как входные параметры. readyA и readyB порты инициировали Обработчик Данных. После отправки истинного сигнала validIn может быть некоторая задержка, прежде чем готовый будет установлен в ложь. Когда Обработчик Данных обнаруживает передний край readyA сигнал, блок устанавливает validInA к истине и отправляет следующую строку A. Когда Обработчик Данных обнаруживает передний край readyB сигнал, блок устанавливает validInB к истине и отправляет следующую матрицу B. Этот протокол позволяет данным быть отправленными каждый раз, когда передний край готового сигнала обнаруживается, гарантируя, что все данные обрабатываются.

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

Используйте функцию помощника setModelWorkspace добавить переменные, заданные выше к рабочему пространству модели. Эти переменные соответствуют параметрам блоков для Комплексной Частично-систолической Матрицы, Решают Используя блок Q-less QR Decomposition.

numSamples = 1; % Number of samples
fixed.example.setModelWorkspace(model,'A',A,'B',B,'m',m,'n',n,'p',p,...
    'numSamples',numSamples,'OutputType',OutputType);

Симулируйте модель

out = sim(model);

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

Комплексная Частично-систолическая Матрица Решает Используя блок Q-less QR Decomposition выходную матрицу X на каждом временном шаге. Когда допустимая матрица результата выводится, блок устанавливает validOut к истине.

X = out.X;

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

Чтобы оценить точность Комплексной Частично-систолической Матрицы Решают Используя блок Q-less QR Decomposition, вычисляют относительную погрешность.

relative_error = norm(double(A'*A*X - B))/norm(double(B)) %#ok<NOPTS>
relative_error =

   1.5587e-04