Этот пример показывает, как реализовать аппаратно-эффективное QR-разложение с помощью блока Complex Partial-Systolic QR Decomposition.
Блок Complex Partial-Systolic QR Decomposition выполняет первый шаг решения матричного уравнения методом наименьших квадратов AX = B, которое преобразует A на месте в R и B на месте в C = Q 'B, затем решает преобразованную систему RX = C, где QR является ортогональным
Чтобы вычислить самостоятельное QR-разложение, этот пример задает B как единичную матрицу, так что выход блока Комплексного Частичного-Систематического QR-Разложения является верхнетреугольной R и C = Q '.
Укажите количество строк в матрицы А и B, количество столбцов в матрицу А и количество столбцов в матрице 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
Используйте функцию helper complexUniformRandomArray
сгенерировать случайную матрицу А таким образом, чтобы действительная и мнимая части элементов массива находились между -1 и + 1, а A является полным рангом. Матрица B является матрицей тождеств.
rng('default')
A = fixed.example.complexUniformRandomArray(-1,1,m,n);
B = eye(m);
Используйте функцию helper qrFixedpointTypes
для выбора типов данных с фиксированной точкой для входных матриц А и B, которые гарантируют отсутствие переполнения при преобразовании A на месте в R и B на месте в C = Q 'B. Дополнительные сведения о том, как выбираются типы данных, см. в документе FixedPointMatrixLibraryDatypesExample.pdf в текущей директории.
Действительная и мнимая части элементов массива находятся между -1 и 1, поэтому максимально возможным абсолютным значением любого элемента является sqrt (2).
max_abs_A = sqrt(2); % 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 = complex(cast(B,'like',T.B));
model = 'ComplexPartialSystolicQRModel';
open_system(model);
Подсистема Обработчика Данных в этой модели принимает в качестве входных параметров сложные матрицы А и B. The ready
порт запускает обработчик данных. После отправки истинного validIn
сигнал, может быть некоторая задержка перед ready
задано значение false. Когда Обработчик данных обнаруживает переднее ребро ready
сигнал, блок устанавливает validIn
true и отправляет следующую строку A и B. Этот протокол позволяет отправлять данные всякий раз, когда переднее ребро ready
обнаруживается сигнал, обеспечивающий обработку всех данных.
Используйте функцию helper setModelWorkspace
чтобы добавить переменные, определенные выше, в рабочее пространство модели. Эти переменные соответствуют параметрам блоков для блока Complex Partial-Systolic QR Decomposition.
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-Разложения выводит матрицы R и C на каждом временном шаге. Когда выводятся допустимые матрицы результатов, блоки устанавливают validOut
к true.
R = out.R; C = out.C;
Блок вычисляет C = Q 'B. В этом примере B является единичной матрицей, поэтому Q = C 'является ортогональным фактором QR-разложения экономического размера.
Q = C';
Q является оротогональным, поэтому Q 'Q является матрицей тождеств в пределах округления.
I = Q'*Q
I = 1.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i 1.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 - 0.0000i 1.0000 + 0.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 62 FractionLength: 50
R является верхней треугольной матрицей.
R
R = 3.1655 + 0.0000i 0.4870 + 1.1980i 0.1466 - 0.9092i 0.0000 + 0.0000i 2.2184 + 0.0000i -0.2159 - 0.0972i 0.0000 + 0.0000i 0.0000 + 0.0000i 2.2903 + 0.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 29 FractionLength: 24
isequal(R,triu(R))
ans = logical 1
Чтобы оценить точность блока Комплексного Частичного-Систематического QR-Разложения, вычислите относительную погрешность.
relative_error = norm(double(Q*R - A))/norm(double(A))
relative_error = 8.3297e-07
Подавить предупреждения mlint.
%#ok<*NOPTS>