В этом примере показано, как реализовать эффективное оборудованием решение методом наименьших квадратов к матричному уравнению AX=B с комплексным знаком с помощью блока Complex Partial-Systolic Matrix Solve Using QR Decomposition.
Задайте количество строк в матрицах A и B, количество столбцов в матрице А и количество столбцов в матрице B.
m = 300; % Number of rows in matrices A and B n = 10; % Number of columns in matrix A p = 1; % Number of columns in matrix B
В данном примере используйте функцию помощника complexRandomLeastSquaresMatrices
сгенерировать случайные матрицы A и B для задачи наименьших квадратов AX=B. Матрицы сгенерированы таким образом, что действительные и мнимые части элементов массива и B между-1 и +1, и A является полным рангом.
rng('default')
[A,B] = fixed.example.complexRandomLeastSquaresMatrices(m,n,p);
Используйте функцию помощника complexQRMatrixSolveFixedpointTypes
выбрать типы данных с фиксированной точкой для входных матриц 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.complexQRMatrixSolveFixedpointTypes(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 = 'ComplexPartialSystolicQRMatrixSolveModel';
open_system(model);
Подсистема Обработчика Данных в этой модели берет комплексные матрицы A и B как входные параметры. ready
порт инициировал Обработчик Данных. После отправки истинного validIn
сигнал, перед ready
может быть некоторая задержка установлен в ложь. Когда Обработчик Данных обнаруживает передний край
ready
сигнал, блок устанавливает validIn
к истине и отправляет следующую строку A и B. Этот протокол позволяет данным быть отправленными каждый раз, когда передний край ready
сигнал обнаруживается, гарантируя, что все данные обрабатываются.
Используйте функцию помощника setModelWorkspace
добавить переменные, заданные выше к рабочему пространству модели. Эти переменные соответствуют параметрам блоков для блока Complex Partial-Systolic Matrix Solve Using QR Decomposition.
numSamples = 1; % Number of sample matrices fixed.example.setModelWorkspace(model,'A',A,'B',B,'m',m,'n',n,'p',p,... 'numSamples',numSamples,'OutputType',OutputType);
out = sim(model);
Блок Complex Partial-Systolic Matrix Solve Using QR Decomposition выходные данные одна строка за один раз. Когда строка результата выводится, блок устанавливает validOut
к истине. Строки X выводятся в порядке, они вычисляются, последняя строка сначала, таким образом, необходимо восстановить данные, чтобы интерпретировать результаты. Чтобы восстановить матрицу X от выходных данных, используйте функцию помощника matrixSolveModelOutputToArray
.
X = fixed.example.matrixSolveModelOutputToArray(out.X,n,p,numSamples);
Чтобы оценить точность блока Complex Partial-Systolic Matrix Solve Using QR Decomposition, вычислите относительную погрешность.
relative_error = norm(double(A*X - B))/norm(double(B)) %#ok<NOPTS>
relative_error = 3.7583e-05