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

Этот пример показывает, как реализовать аппаратно эффективное решение методом наименьших квадратов для вещественного матричного уравнения AX = B с помощью решения Real Burst Matrix Solve с использованием блока QR Decomposition.

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

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

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

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

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

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

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

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

max_abs_A = 1;  % max(abs(A(:))
max_abs_B = 1;  % max(abs(B(:))
f = 24;         % Fraction length (bits of precision)

T = fixed.example.realQRMatrixSolveFixedpointTypes(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 = 'RealBurstQRMatrixSolveModel';
open_system(model);

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

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

Используйте функцию helper setModelWorkspace чтобы добавить переменные, определенные выше, в рабочее пространство модели. Эти переменные соответствуют параметрам блоков для решения Real Burst Matrix Solve с использованием блока 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);

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

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

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

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

Чтобы оценить точность решения Матрицы Real Burst Используя блок QR Decomposition, вычислите относительную погрешность.

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

   3.5192e-06

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