В этом примере показано, как использовать эффективную оборудованием Действительную Частично-систолическую Матрицу, Решают Используя Разложение Q-less QR с блоком Forgetting Factor.
Действительная Частично-систолическая Матрица Решает Используя Разложение Q-less QR с реализациями блока Forgetting Factor следующую рекурсию, чтобы вычислить верхний треугольный множитель R непрерывной потоковой передачи n-1 векторы-строки (k, :) с помощью упущения фактора. Это - как будто матрица А бесконечно высока. Упущение включает область значений, мешает ему объединяться без связанного.
Когда верхний треугольный множитель готов, затем передайте, и обратная подстановка вычисляются с текущим входом B, чтобы произвести выход X.
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 создаются таким образом, что величина их элементов меньше чем или равна одному. Ваши собственные системные требования зададут, каковы те значения. Если вы не знаете то, что они, и A и B являются входом фиксированной точки к системе, то можно использовать upperbound
функция, чтобы определить верхние границы фиксированных точек A и B.
max_abs_A
верхняя граница на максимальном элементе массива величины.
max_abs_A = 1;
max_abs_B
верхняя граница на максимальном элементе величины B.
max_abs_B = 1;
Используйте fixed.realQlessQRMatrixSolveFixedpointTypes
функция, чтобы вычислить фиксированные точки.
T = fixed.realQlessQRMatrixSolveFixedpointTypes(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.realRandomQlessQRMatrices(numInputs,n,p);
Бросьте входные параметры к типам, определенным fixed.realQlessQRMatrixSolveFixedpointTypes
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*numInputs + n)*T.A.WordLength;
model = 'RealPartialSystolicMatrixSolveQlessQRForgettingFactorModel';
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);
Задайте матрицу можно следующим образом
Затем с помощью формулы для расчета th выход и то, что, можно показать это
Таким образом проверить выход, различие между и должно быть малым.
Выберите последний выход симуляции.
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 = 485
VerifyThat
с небольшой относительной погрешностью.
A_k = alpha.^(k:-1:1)' .* A(1:k,:); relative_error = norm(A_k'*A_k*X - B)/norm(B)
relative_error = 7.7628e-04
Подавите mlint предупреждения в этом файле.
%#ok<*NOPTS>
Real Partial-Systolic Matrix Solve Using Q-less QR Decomposition with Forgetting Factor