Этот пример показывает, как реализовать аппаратно-эффективное решение комплексного матричного уравнения A 'AX = B с помощью решения Комплексной пакетной матрицы с использованием блока QR-разложения без Q.
Укажите количество строк в матрице А, количество столбцов в матрице А и строк В и количество столбцов в матрице B.
m = 100; % Number of rows in A n = 10; % Number of columns in A and rows in B p = 1; % Number of columns in B
В данном примере используйте функцию helper complexRandomQlessQRMatrices
чтобы сгенерировать случайные матрицы А и B для задачи A 'AX = B. Матрицы сгенерированы таким образом, что действительная и мнимая части элементов массива и B находятся между -1 и + 1, а A является полным рангом.
rng('default')
[A,B] = fixed.example.complexRandomQlessQRMatrices(m,n,p);
Используйте функцию helper complexQlessQRMatrixSolveFixedpointTypes
выбрать типы данных с фиксированной точкой для входных матриц А и B и вывести X так, что существует низкая вероятность переполнения во время расчета. Дополнительные сведения о том, как выбираются типы данных, см. в документе FixedPointMatrixLibraryDatypesExample.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 = 'ComplexBurstQlessQRMatrixSolveModel';
open_system(model);
Подсистема Обработчика Данных в этой модели принимает в качестве входных параметров сложные матрицы А и B. The ready
порт запускает обработчик данных. После отправки истинного validIn
сигнал, может быть некоторая задержка перед ready
задано значение false. Когда Обработчик данных обнаруживает переднее ребро ready
сигнал, блок устанавливает validIn
true и отправляет следующую строку A и B. Этот протокол позволяет отправлять данные всякий раз, когда переднее ребро ready
обнаруживается сигнал, обеспечивающий обработку всех данных.
Используйте функцию helper 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 выводит данные по одной строке за раз. Когда выводится строка результата, блок устанавливает validOut
к true. Строки X выводятся в том же порядке, в котором они вычисляются, первая последняя строка, поэтому необходимо восстановить данные, чтобы интерпретировать результаты. Чтобы восстановить матрицу X из выхода данных, используйте функцию helper matrixSolveModelOutputToArray
.
X = fixed.example.matrixSolveModelOutputToArray(out.X,n,p);
Чтобы оценить точность решения Complex Burst Matrix Solve с использованием блока Q-less QR Decomposition, вычислите относительную погрешность.
relative_error = norm(double(A'*A*X - B))/norm(double(B)) %#ok<NOPTS>
relative_error = 2.5932e-04