В этом примере показано, как реализовать аппаратно эффективную QR-декомпозицию без Q, используя блок комплексной Q-декомпозиции без QR.
Блок QR декомпозиции комплексного пакета без Q выполняет первый шаг решения матричного уравнения A 'AX = B, которое преобразует A на месте в верхнетреугольный R, затем решает преобразованную систему R' RX = B, где R 'R = A' A.
Укажите количество строк и столбцов в матрице A.
m = 5; % Number of rows in matrix A n = 3; % Number of columns in matrix A
Использовать функцию помощника complexUniformRandomArray для генерации случайной матрицы A таким образом, что действительная и мнимая части элементов A находятся между -1 и + 1, а A является полным рангом.
rng('default')
A = fixed.example.complexUniformRandomArray(-1,1,m,n);
Использовать функцию помощника qlessqrFixedpointTypes для выбора типов данных с фиксированной точкой для матрицы A, которые гарантируют отсутствие переполнения при преобразовании A по месту в R. Дополнительные сведения о том, как выбираются типы данных, см. в документе FixedStartMatrixMatrixDatatypesExample.pdf в текущем каталоге.
Действительная и мнимая части элементов A находятся между -1 и 1, поэтому максимально возможное абсолютное значение любого элемента равно sqrt (2).
max_abs_A = sqrt(2); % max(abs(A(:)) f = 24; % Fraction length (bits of precision) T = fixed.example.qlessqrFixedpointTypes(m,max_abs_A,f); A = cast(A,'like',T.A);
model = 'ComplexBurstQlessQRModel';
open_system(model);

Подсистема обработчика данных в этой модели принимает в качестве входных данных сложную матрицу А. ready порт запускает обработчик данных. После отправки true validIn сигнал, может быть некоторая задержка перед ready имеет значение false. Когда обработчик данных обнаруживает передний край ready сигнал, комплекты блоков validIn true и отправляет следующую строку A. Этот протокол позволяет отправлять данные всякий раз, когда передний край ready обнаруживается сигнал, обеспечивающий обработку всех данных.
Использовать функцию помощника setModelWorkspace для добавления переменных, определенных выше, в рабочее пространство модели. Эти переменные соответствуют параметрам блока для блока QR-декомпозиции комплексного пакета без Q.
numSamples = 1; % Number of sample matrices fixed.example.setModelWorkspace(model,'A',A,'m',m,'n',n,... 'numSamples',numSamples);
out = sim(model);
Блок QR декомпозиции комплексного пакета без Q выводит данные по одной строке за раз. При выводе строки результата блок устанавливает validOut к true. Строки матрицы R выводятся в обратном порядке, чтобы приспособиться к обратной подстановке, поэтому для интерпретации результатов необходимо восстановить данные. Для восстановления матрицы R из выходных данных используется вспомогательная функция. qlessqrModelOutputToArray.
R = fixed.example.qlessqrModelOutputToArray(out.R,m,n,numSamples);
R - верхнетреугольная матрица.
R
R =
2.1863 + 0.0000i 0.6427 - 1.0882i -0.5771 - 0.3089i
0.0000 + 0.0000i 1.8126 + 0.0000i 0.2095 + 0.0599i
0.0000 + 0.0000i 0.0000 + 0.0000i 1.7760 + 0.0000i
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 28
FractionLength: 24
isequal(R,triu(R))
ans = logical 1
Чтобы оценить точность блока комплексной Q-безбарьерной QR-декомпозиции, вычислите относительную ошибку.
relative_error = norm(double(R'*R - A'*A))/norm(double(A'*A))
relative_error = 1.3472e-06
Подавление предупреждений mlint.
%#ok<*NOPTS>