Этот пример показывает, как реализовать аппаратно эффективное решение методом наименьших квадратов для вещественного матричного уравнения AX = B с помощью решения Real Partial-Systolic Matrix Solve с использованием блока QR Decomposition.
Задайте количество строк в матрицах А и 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
В данном примере используйте функцию helper realRandomLeastSquaresMatrices
чтобы сгенерировать случайные матрицы А и B для задачи наименьших квадратов AX = B. Матрицы сгенерированы таким образом, что элементы массива и B находятся между -1 и + 1, а A является полным рангом.
rng('default')
[A,B] = fixed.example.realRandomLeastSquaresMatrices(m,n,p);
Используйте функцию 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 = 'RealPartialSystolicQRMatrixSolveModel';
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,... 'numSamples',numSamples,'OutputType',OutputType);
out = sim(model);
Решение Действительной Частичной-Систематической Матрицы Использование блока QR-Декомпозиции выводит данные по одной строке за раз. Когда выводится строка результата, блок устанавливает validOut
к true. Строки X выводятся в том же порядке, в котором они вычисляются, первая последняя строка, поэтому необходимо восстановить данные, чтобы интерпретировать результаты. Чтобы восстановить матрицу X из выхода данных, используйте функцию helper matrixSolveModelOutputToArray
.
X = fixed.example.matrixSolveModelOutputToArray(out.X,n,p,numSamples);
Чтобы оценить точность решения Действительной Частичной-Систематической Матрицы Используя блок QR-Декомпозиции, вычислите относительную погрешность.
relative_error = norm(double(A*X - B))/norm(double(B)) %#ok<NOPTS>
relative_error = 2.3952e-05