Эффективная оборудованием комплексная частично-систолическая матрица реализации решает Используя разложение Q-less QR с упущением фактора

В этом примере показано, как использовать эффективную оборудованием Комплексную Частично-систолическую Матрицу, Решают Используя Разложение Q-less QR с блоком Forgetting Factor.

Разложение Q-less QR с упущением фактора

Комплексная Частично-систолическая Матрица Решает Используя Разложение Q-less QR с реализациями блока Forgetting Factor следующую рекурсию, чтобы вычислить верхний треугольный множитель R непрерывной потоковой передачи n-1 векторы-строки (k, :) с помощью упущения фактора$\alpha$. Это - как будто матрица А бесконечно высока. Упущение включает область значений$0<\alpha<1$, мешает ему объединяться без связанного.

$$&#xA;\begin{array}{ccl}&#xA;R_0 &#38; =&#38; \mbox{zeros}(n,n)\\[2ex]&#xA;[\sim\;,\;R_1] &#38;=&#38; \mbox{qr}\left(\alpha\left[\begin{array}{c}R_0\\&#xA;A(1,:)\end{array}\right],\; 0\right)\\[4ex]&#xA;[\sim\;,\;R_2] &#38;=&#38; \mbox{qr}\left(\alpha\left[\begin{array}{c}R_1\\&#xA;A(2,:)\end{array}\right],\; 0\right)\\[4ex]&#xA;\vdots\\[4ex]&#xA;[\sim\;,\;R_k] &#38;=&#38; \mbox{qr}\left(\alpha\left[\begin{array}{c}R_{k-1}\\&#xA;A(k,:)\end{array}\right],\; 0\right)\\[4ex]&#xA;\vdots\\[4ex]&#xA;\end{array}&#xA;$$

Вперед и обратная подстановка

Когда верхний треугольный множитель готов, затем передайте, и обратная подстановка вычисляются с текущим входом B, чтобы произвести выход X.

$$ X = R_k\setminus(R_k'\setminus B)$$

Задайте системные параметры

n длина векторов-строк (k, :), количество строк в B и количество строк и столбцов в R.

n = 5;

p количество столбцов в B

p = 1;

m эффективные количества строк, чтобы объединяться.

m = 100;

Используйте fixed.forgettingFactor функция, чтобы вычислить фактор упущения в зависимости от количества строк, которые вы интегрируете.

forgettingFactor = fixed.forgettingFactor(m)
forgettingFactor =

    0.9950

precisionBits задает количество битов точности, требуемой для Разложения QR. Установите это значение согласно системным требованиям.

precisionBits = 24;

В этом примере матрицы с комплексным знаком A и B создаются таким образом, что величина их действительных и мнимых частей их элементов меньше чем или равна одному, таким образом, максимальное возможное абсолютное значение любого элемента$|1+1i|=\sqrt{2}$. Ваши собственные системные требования зададут, каковы те значения. Если вы не знаете то, что они, и A и B являются входом фиксированной точки к системе, то можно использовать upperbound функция, чтобы определить верхние границы фиксированных точек A и B.

max_abs_A верхняя граница на максимальном элементе массива величины.

max_abs_A = sqrt(2);

max_abs_B верхняя граница на максимальном элементе величины B.

max_abs_B = sqrt(2);

Выберите Fixed-Point Types

Используйте fixed.complexQlessQRMatrixSolveFixedpointTypes функция, чтобы вычислить фиксированные точки.

T = fixed.complexQlessQRMatrixSolveFixedpointTypes(m,n,max_abs_A,max_abs_B,precisionBits);

T.A фиксированная точка, вычисленная для преобразования к R, оперативному так, чтобы это не переполнялось.

T.A
ans = 

[]

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 30
        FractionLength: 24

T.B тип, вычисленный для B так, чтобы это не переполнялось.

T.B
ans = 

[]

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 27
        FractionLength: 24

T.X тип, вычисленный для выхода X так, чтобы была низкая вероятность переполнения.

T.X
ans = 

[]

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 75
        FractionLength: 24

Задайте параметры симуляции

Создайте случайную матрицу А, чтобы содержать конкретное количество входных параметров и n-by-p случайную матрицу B.

numInputs количество входных строк A (k, :) для этого примера.

numInputs = 500;
rng('default')
[A,B] = fixed.example.complexRandomQlessQRMatrices(numInputs,n,p);

Бросьте входные параметры к типам, определенным fixed.complexQlessQRMatrixSolveFixedpointTypes.

A = cast(A,'like',T.A);
B = cast(B,'like',T.B);

Используйте fixed.extractNumericType функционируйте, чтобы извлечь numerictype возразите, чтобы использовать в качестве входного параметра с блоком.

OutputType = fixed.extractNumericType(T.X)
OutputType =


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 75
        FractionLength: 24

Бросьте фактор упущения к фиксированной точке с тем же размером слова как A и масштабирование лучшей точности.

forgettingFactor = fi(forgettingFactor,1,T.A.WordLength);

Выберите время остановки для симуляции, которая достаточно долга, чтобы обработать все входные параметры от A.

stopTime = 2*(2*numInputs + n)*T.A.WordLength;

Откройте модель

model = 'ComplexPartialSystolicSolveQlessQRForgettingFactorModel';
open_system(model);

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

Используйте функцию помощника setModelWorkspace добавить переменные, заданные выше к рабочему пространству модели.

fixed.example.setModelWorkspace(model,'A',A,'B',B,'n',n,'p',p,...
    'forgettingFactor',forgettingFactor,'OutputType',OutputType,...
    'stopTime',stopTime);

Симулируйте модель

out = sim(model);

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

Задайте матрицу$A_k$ можно следующим образом

$$A_k = \left[\begin{array}{cccc}\alpha^k \\&#38; \alpha^{k-1} \\&#xA;&#38; &#38; \ddots\\&#38;&#xA;&#38; &#38; \alpha\end{array}\right]A(1:k,\; :).$$

Затем с помощью формулы для расчета$k$ th выход $R_k$и то, что$[Q,R]=\mbox{qr}(A,0) \Rightarrow A'A = R'Q'QR = R'R$, можно показать это

$$A_k'A_k X = R_k'R_k X = B.$$

Таким образом проверить выход, различие между$A_k'A_k X$ и$B$ должно быть малым.

Выберите последний выход симуляции.

X = double(out.X(:,:,end));

Синхронизируйте последний выход X с входом путем нахождения количества входных параметров, которые произвели его.

A = double(A);
B = double(B);
alpha = double(forgettingFactor);
relative_errors = nan(1,numInputs);
for k = 1:numInputs
    A_k = alpha.^(k:-1:1)' .* A(1:k,:);
    relative_errors(k) = norm(A_k'*A_k*X - B)/norm(B);
end

k количество входных параметров (k, :) который произвел последнее X.

k = find(relative_errors==min(relative_errors))
k =

   493

VerifyThat

$$A_k'A_k X = B$$

с небольшой относительной погрешностью.

A_k =  alpha.^(k:-1:1)' .* A(1:k,:);
relative_error = norm(A_k'*A_k*X - B)/norm(B)
relative_error =

   4.0692e-05

Подавите mlint предупреждения в этом файле.

%#ok<*NOPTS>

Смотрите также