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

Этот пример демонстрирует, как вычислить разложение QR комплексных матриц с помощью эффективного оборудованием кода MATLAB® в Simulink®. Эта модель совместно использует вычислительные ресурсы через шаги Алгоритма разложения QR. Это таким образом использует меньше на ресурсах чипа, чем полностью конвейерный подход при принесении в жертву некоторой общей пропускной способности.

Решение матричных уравнений с разложением QR

При решении матричных уравнений редко, если когда-либо, необходимо вычислить инверсию матрицы [1] [3]. Блок Complex Burst QR Decomposition предоставляет оборудованию эффективный способ решить уравнение

где комплекс m x n матрица, является комплексом n x p матрица и является комплексом m x p матрица. Это уравнение может быть преобразовано в форму

через ряд ортогональных преобразований. Здесь, комплекс m x n верхняя треугольная матрица. комплекс m x m ортогональная матрица, таким образом что. Комплексный Пакет Разложение QR сохраняет только ненулевые строки, наряду с соответствующими строками.

Разложение QR хорошо подходит для архитектуры фиксированной точки, потому что оно может быть полностью выполнено с вращениями Givens. Они имеют эффективную реализацию фиксированной точки с точки зрения Алгоритма CORDIC. Для получения дополнительной информации на алгоритме для фиксированной точки разложение QR, смотрите, Выполняют QR-факторизацию Используя CORDIC. Модель Simulink, используемая в этом примере:

fxpdemo_complex_burst_QR_model

Эта модель работает с фиксированной точкой, дважды, одним, и масштабируемыми двойными типами данных.

Введите параметры для комплексного пакета разложение QR

Блок Complex Burst QR Decomposition берет четыре входных параметра. Маску для этого блока показывают ниже:

Необходимо присвоить входные данные переменным в рабочем пространстве MATLAB. Чтобы настроить этот алгоритм, измените данные согласно процедурам, используемым в следующих разделах.

Задайте матричные размерности

Архитектура модели выделяет минимальную память, необходимую, чтобы хранить данные, должен был выполнить разложение QR. Поэтому размер входных матриц должен быть известен во время компиляции. Здесь, m является количеством строк в комплексных матрицах A и B, n является количеством столбцов в A, и p является количеством столбцов в B.

Кроме того, поскольку блок может обработать разложение неопределенного количества матриц последовательно, много выборок задан. Модель останавливается, когда все выборки использовались.

m = 4;
n = 4;
p = 4;
num_samples = 100;

Входные Define типы данных

Прежде, чем сгенерировать входные данные, важно задать тип данных матричных данных как показано ниже. Этот пример использует подписанные фиксированные точки с размерами слова на 16 битов и дробными типами. Для комплексных 4 x 4 матрицы выходному типу нужны дополнительные 3 бита, чтобы разместить рост данных в целой части входных данных; смотрите Использование Эффективный Оборудованием Алгоритм, чтобы Решить Системы Линейных уравнений с комплексным знаком для получения дальнейшей информации.

word_length = 16;
qr_growth_bits = 3;
fraction_length = word_length - 1;
nt = numerictype(1,word_length + qr_growth_bits,fraction_length)
nt =


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 19
        FractionLength: 15

Задайте количество итераций CORDIC

Приближение CORDIC для вращений Givens является итеративным алгоритмом, который дает дополнительный бит точности на итерацию. Для типов данных фиксированной точки со знаком достигается самая большая точность, когда количество выполняемых итераций является тем меньше, чем wordlength.

NumberOfCORDICIterations = nt.WordLength - 1
NumberOfCORDICIterations =

    18

Инициализируйте случайные данные

Обработчик данных в этом примере берет комплексные матрицы A и B как входные параметры. В этом примере A и B заданы как случайные элементы матриц, чертившие от равномерного распределения от-1 до 1. Обратите внимание на то, что A и B каждый заданы как 3D массивы, где каждая демонстрационная матрица хранится в первых двух размерностях.

A = fi(complex(2*rand(m,n,num_samples) - 1, 2*rand(m,n,num_samples) - 1),nt);
B = fi(complex(2*rand(m,p,num_samples) - 1, 2*rand(m,p,num_samples) - 1),nt);

Передача данных, чтобы объединить пакет разложение QR

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

Обработка Выходных параметров

Комплексный Burst QR Decomposition данные выходных параметров одна строка за один раз. Каждый раз, когда блок выводит строку результата, он утверждает validOut. Обратите внимание на то, что rOut выходные параметры строки, в то время как cOut выходные параметры строки. Строки выводятся в обратном порядке, когда это - естественный порядок, чтобы использовать их для задней замены. В этом примере они сохранены как (m * num_samples) x матрицы n со строками, упорядоченными, когда они были получены.

Моделировать

sim fxpdemo_complex_burst_QR_model

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

Поскольку данные выводятся в обратном порядке, необходимо восстановить данные, чтобы интерпретировать результаты. Следующий код помещает данные в правильном порядке.

C = cell(1,num_samples);
R = cell(1,num_samples);
for ii = 1:num_samples
    C{ii} = flipud(C_Out((ii-1)*m + 1:ii*m,:));
    R{ii} = flipud(R_Out((ii-1)*m + 1:ii*m,:));
end

Оцените точность результата

Чтобы оценить точность Пакета Разложение QR, исследуйте значение различия между решением матричного уравнения с помощью блока 'Complex QR Burst Decomposition' и, встроенный backsolve MATLAB® полученного использования для удваивается. Постройте номер абсолютной погрешности и условия для каждой выборки. Данные показывают, что точность решения отслеживает номер условия, как ожидается [2].

xAct = cell(1,num_samples);
xExp = cell(1,num_samples);
xErr = zeros(1,num_samples);
condNumber = zeros(1,num_samples);
for ii = 1:num_samples
    xAct{ii} = double(R{ii})\double(C{ii});
    xExp{ii} = double(A(:,:,ii))\double(B(:,:,ii));
    xErr(ii) = norm(xAct{ii} - xExp{ii});
    condNumber(ii) = cond(double(A(:,:,ii)));
end
figure(1)
clf
h1 = subplot(2,1,1);
hold on;
h1.YScale = 'log';
plot(xErr)
grid on
title('Error of ''Complex Burst QR Decomposition''');
ylabel('norm(R\\C - A\\B)');
h2 = subplot(2,1,2);
hold on;
h2.YScale = 'log';
plot(condNumber);
grid on
title('Condition Number of Samples');
ylabel('cond(A)');
xlabel('Test Point');
linkaxes([h1,h2],'x');

Закройте модель

close_system fxpdemo_complex_burst_QR_model

Ссылки

[1] Джордж Э. Форсайт, М.А. Молком и Клив Б. Молер. Компьютерные методы для математических вычислений. Englewood Cliffs, Нью-Джерси: Prentice Hall, 1977.

[2] Клив Б. Молер. Угол Клива: Каково Количество Условия Матрицы?, MathWorks, Inc. 2017.

[3] Клив Б. Молер. Числовое Вычисление с MATLAB. SIAM, 2004. ISBN: 978-0-898716-60-3.

%#ok<*NASGU,*NOPTS>