Реализуйте аппаратно-эффективное решение комплексной частисистемной матрицы с использованием QR-декомпозиции с диагональной загрузкой

Этот пример показывает, как реализовать аппаратно эффективное решение методом наименьших квадратов для комплексного матричного уравнения

$$\left[\begin{array}{c}\lambda I\\A\end{array}\right] X =
\left[\begin{array}{c}O\\B\end{array}\right]$$

Использование решения Комплексной Частичной-Systolic Матрицы с использованием блока QR-Декомпозиции. Этот метод известен как диагональная загрузка и$\lambda$ известен как параметр регуляризации.

Диагональный метод загрузки

Когда вы устанавливаете параметр регуляризации в ненулевое значение в блоке Complex Partial-Systolic Matrix Solve Using QR Decomposition, то блок вычисляет решение методом наименьших квадратов

$$\left[\begin{array}{c}\lambda I\\A\end{array}\right] X =
\left[\begin{array}{c}O\\B\end{array}\right]$$

где$I$ является единичной матрицей n на n и$O$ является массивом нулей размера n на p.

Этот метод известен как диагональная загрузка и$\lambda$ известен как параметр регуляризации. Знакомым хрестоматийным решением методом наименьших квадратов для этого уравнения является следующее, которое определяется путем умножения обеих сторон уравнения$[\lambda I,\; A']$ на и взятия обратной матрицы с левой стороны.

$$X_{LS} = (\lambda^2 I + A'A)^{-1}A'B.$$

Решение Комплексной Частичной-Систематической Матрицы Использование блока QR-Разложения вычисляет решение эффективно, не вычисляя обратную путем вычисления QR-разложения, преобразования

$$\left[\begin{array}{c}\lambda I\\A\end{array}\right]$$

на месте к верхней треугольной R, и преобразование

$$\left[\begin{array}{c}O\\B\end{array}\right]$$

по месту на

$$C = Q'\left[\begin{array}{c}O\\B\end{array}\right]$$

и решение преобразованного уравнения.$RX=C$

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

Задайте количество строк в матрицах А и 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

Задайте параметр регуляризации

Когда параметр регуляризации ненулевой в блоке Complex Partial-Systolic Matrix Solve Используя QR-разложение, используется метод диагональной загрузки. Когда параметр регуляризации равен нулю, уравнения уменьшаются до правильной формулы наименьших квадратов AX = B.

regularizationParameter = 1e-3;

Параметры блоков

Сгенерируйте случайные матрицы методом наименьших квадратов

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

rng('default')
r = 3;   % Rank of matrix A
[A,B] = fixed.example.complexRandomLeastSquaresMatrices(m,n,p,r);

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

Используйте функцию helper complexQRMatrixSolveFixedpointTypes выбрать типы данных с фиксированной точкой для входных матриц А и 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.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 = 'ComplexPartialSystolicQRDiagonalLoadingMatrixSolveModel';
open_system(model);

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

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

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

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

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

out = sim(model);

Построение решения из выходных данных

Решение Комплексной Частичной-Систематической Матрицы Использование блока QR-Декомпозиции выводит данные по одной строке за раз. Когда выводится строка результата, блок устанавливает validOut к true. Строки X выводятся в том же порядке, в котором они вычисляются, первая последняя строка, поэтому необходимо восстановить данные, чтобы интерпретировать результаты. Чтобы восстановить матрицу X из выхода данных, используйте функцию helper matrixSolveModelOutputToArray.

X = fixed.example.matrixSolveModelOutputToArray(out.X,n,p,numSamples);

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

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

A_lambda = [regularizationParameter * eye(n);A];
B_0 = [zeros(n,p);B];
relative_error = norm(double(A_lambda*X - B_0))/norm(double(B_0)) %#ok<NOPTS>
relative_error =

   1.0386e-04

Для просмотра документации необходимо авторизоваться на сайте