В этом примере показано, как реализовать аппаратно эффективную декомпозицию QR с использованием блока декомпозиции QR реального пакета.
Блок декомпозиции QR реального пакета выполняет первый шаг решения уравнения AX = B матрицы наименьших квадратов, которое преобразует A на месте в R и B на месте в C = Q 'B, затем решает преобразованную систему RX = C, где QR является ортогонально-треугольным разложением A.
Чтобы вычислить автономное QR разложение, этот пример устанавливает B в качестве единичной матрицы, так что выходной сигнал блока реального QR разложения является верхним треугольным R и C = Q '.
Укажите количество строк в матрицах A и B, количество столбцов в матрице A и количество столбцов в матрице B. В этом примере в качестве B устанавливается единичная матрица того же размера, что и число строк A.
m = 10; % Number of rows in matrices A and B n = 3; % Number of columns in matrix A p = m; % Number of columns in matrix B
Использовать функцию помощника realUniformRandomArray для генерации случайной матрицы A, так что элементы A находятся между -1 и + 1, а A является полным рангом. Матрица B является единичной матрицей.
rng('default')
A = fixed.example.realUniformRandomArray(-1,1,m,n);
B = eye(m);
Использовать функцию помощника qrFixedpointTypes для выбора типов данных с фиксированной точкой для матриц A и B, которые гарантируют отсутствие переполнения при преобразовании A in-place в R и B in-place в C = Q 'B. Дополнительные сведения о том, как выбираются типы данных, см. в документе 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.qrFixedpointTypes(m,max_abs_A,max_abs_B,f); A = cast(A,'like',T.A); B = cast(B,'like',T.B);
model = 'RealBurstQRModel';
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);
out = sim(model);
Блок QR-декомпозиции реального пакета выводит данные по одной строке за раз. При выводе строки результата блок устанавливает validOut к true. Строки матриц R и C выводятся в обратном порядке, чтобы приспособиться к обратной подстановке, поэтому для интерпретации результатов необходимо восстановить данные. Для восстановления матриц R и C из выходных данных используется вспомогательная функция. qrModelOutputToArray.
[C,R] = fixed.example.qrModelOutputToArray(out.C,out.R,m,n,p,numSamples);
Блок вычисляет C = Q 'B. В этом примере B является единичной матрицей, поэтому Q = C 'является ортогональным коэффициентом экономии для QR-разложения.
Q = C';
Q является орогональной, так что Q 'Q является единичной матрицей в пределах округления.
I = Q'*Q
I =
1.0000 -0.0000 -0.0000
-0.0000 1.0000 -0.0000
-0.0000 -0.0000 1.0000
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 60
FractionLength: 48
R - верхнетреугольная матрица.
R
R =
2.2180 0.8559 -0.5607
0 2.0578 -0.4017
0 0 1.7117
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 28
FractionLength: 24
isequal(R,triu(R))
ans = logical 1
Чтобы оценить точность блока QR-декомпозиции реального пакета, вычислите относительную ошибку.
relative_error = norm(double(Q*R - A))/norm(double(A))
relative_error = 1.3415e-06
Подавление предупреждений mlint.
%#ok<*NOPTS>