Реализуйте аппаратно-эффективное комплексное разложение QR пакета

Этот пример показывает, как реализовать аппаратно-эффективное QR-разложение с помощью блока Complex Burst QR Decomposition.

Размер экономики QR-декомпозиция

Блок Complex Burst QR Decomposition выполняет первый шаг решения уравнения матрицы наименьших квадратов AX = B, которое преобразует A на месте в R и B на месте в C = Q 'B, затем решает преобразованную систему RX = C, где QR является ортогонально-треугольным разложением

Чтобы вычислить самостоятельное QR-разложение, этот пример задает B как единичную матрицу, так что выход блока Complex Burst QR Decomposition является верхнетреугольным 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

Сгенерируйте матрицы А и 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 = 'ComplexBurstQRModel';
open_system(model);

Подсистема Обработчика Данных в этой модели принимает в качестве входных параметров сложные матрицы А и B. The ready порт запускает обработчик данных. После отправки истинного validIn сигнал, может быть некоторая задержка перед ready задано значение false. Когда Обработчик данных обнаруживает переднее ребро ready сигнал, блок устанавливает validIn true и отправляет следующую строку A и B. Этот протокол позволяет отправлять данные всякий раз, когда переднее ребро ready обнаруживается сигнал, обеспечивающий обработку всех данных.

Установите переменные в рабочем пространстве модели

Используйте функцию helper setModelWorkspace чтобы добавить переменные, определенные выше, в рабочее пространство модели. Эти переменные соответствуют параметрам блоков для блока Complex Burst 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);

Построение решения из выходных данных

Блок Complex Burst QR Decomposition выводит данные по одной строке за раз. Когда выводится строка результата, блок устанавливает validOut к true. Строки матриц R и C выводятся в обратном порядке, чтобы включать обратное замещение, поэтому вы должны восстановить данные, чтобы интерпретировать результаты. Чтобы восстановить матрицы R и C из данных выходов, используйте функцию helper qrModelOutputToArray.

[C,R] = fixed.example.qrModelOutputToArray(out.C,out.R,m,n,p,numSamples);

Извлечение Economy-Size Q

Блок вычисляет C = Q 'B. В этом примере B является единичной матрицей, поэтому Q = C 'является ортогональным фактором QR-разложения экономического размера.

Q = C';

Проверьте, что Q ортогональна, а R - верхнетреугольная

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: 60
        FractionLength: 48

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

Проверьте точность выхода

Чтобы оценить точность блока Complex Burst QR Decomposition, вычислите относительную погрешность.

relative_error = norm(double(Q*R - A))/norm(double(A))
relative_error =

   1.7960e-06

Подавить предупреждения mlint.

%#ok<*NOPTS>
Для просмотра документации необходимо авторизоваться на сайте