В этом примере показано, как реализовать аппаратное эффективное решение матричного уравнения 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);
Используйте функцию помощника complexQlessQRMatrixSolveFixedpointTypes
выбрать типы данных с фиксированной точкой для входных матриц A и B и вывести X таким образом, что существует низкая вероятность переполнения во время расчета. Для получения дополнительной информации о том, как типы данных выбраны, см. документ FixedPointMatrixLibraryDatatypesExample.pdf в текущем каталоге.
Действительные и мнимые части элементов массива и B между-1 и 1, таким образом, максимальное возможное абсолютное значение любого элемента является sqrt (2).
max_abs_A = sqrt(2); % max(abs(A(:)) max_abs_B = sqrt(2); % max(abs(B(:)) f = 24; % Fraction length (bits of precision) T = fixed.example.complexQlessQRMatrixSolveFixedpointTypes(m,n,max_abs_A,max_abs_B,f); 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