В этом примере показано, как реализовать аппаратно эффективное решение методом наименьших квадратов для матричного уравнения AX = B с действительным значением с использованием блока «Решение матрицы реального пакета с использованием QR-разложения».
Укажите количество строк в матрицах A и B, количество столбцов в матрице A и число столбцов в матрице 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
Для этого примера используйте функцию помощника realRandomLeastSquaresMatrices для генерации случайных матриц A и B для задачи с наименьшими квадратами AX = B. Матрицы генерируются так, что элементы A и B находятся между -1 и + 1, а A имеет ранг r.
rng('default') r = 3; % Rank of A [A,B] = fixed.example.realRandomLeastSquaresMatrices(m,n,p,r);
Использовать функцию помощника realQRMatrixSolveFixedpointTypes для выбора типов данных с фиксированной точкой для входных матриц А и В и выходных данных Х так, чтобы была низкая вероятность переполнения во время вычисления. Дополнительные сведения о том, как выбираются типы данных, см. в документе FixedStartMatrixLibrureDatatypesExample.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);

Подсистема обработчика данных в этой модели принимает вещественные матрицы A и B в качестве входных данных. ready порт запускает обработчик данных. После отправки true validIn сигнал, может быть некоторая задержка перед ready имеет значение false. Когда обработчик данных обнаруживает передний край ready сигнал, комплекты блоков validIn true и отправляет следующую строку A и B. Этот протокол позволяет отправлять данные всякий раз, когда передний край ready обнаруживается сигнал, обеспечивающий обработку всех данных.
Использовать функцию помощника 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);
Блок Real Burst Matrix Solve Using QR Decomption выводит данные по одной строке за раз. При выводе строки результата блок устанавливает validOut к true. Строки X выводятся в том порядке, в котором они вычисляются, сначала последняя строка, поэтому для интерпретации результатов необходимо восстановить данные. Для восстановления матрицы X из выходных данных используйте вспомогательную функцию 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 = 3.5192e-06