В этом примере показано, как реализовать аппаратно эффективное решение для комплексного матричного уравнения A 'AX = B с использованием блока «Решение комплексной пакетной матрицы с использованием QR-декомпозиции без Q».
Укажите количество строк в матрице A, количество столбцов в матрице A и строк в матрице B и количество столбцов в матрице B.
m = 100; % Number of rows in A n = 10; % Number of columns in A and rows in B p = 1; % Number of columns in B
Для этого примера используйте функцию помощника complexRandomQlessQRMatrices для генерации случайных матриц A и B для задачи A 'AX = B. Матрицы генерируются так, что действительная и мнимая части элементов A и B находятся между -1 и + 1, а A - полный ранг.
rng('default')
[A,B] = fixed.example.complexRandomQlessQRMatrices(m,n,p);
Использовать функцию помощника complexQlessQRMatrixSolveFixedpointTypes для выбора типов данных с фиксированной точкой для входных матриц А и В и выходных данных Х так, чтобы была низкая вероятность переполнения во время вычисления. Дополнительные сведения о том, как выбираются типы данных, см. в документе FixedStartMatrixLibrureDatatypesExample.pdf в текущей папке.
Действительная и мнимая части элементов A и B находятся между -1 и 1, поэтому максимально возможное абсолютное значение любого элемента равно sqrt (2).
max_abs_A = sqrt(2); % max(abs(A(:)) max_abs_B = sqrt(2); % max(abs(B(:)) f = 24; % Fraction length (bits of precision) T = fixed.example.complexQlessQRMatrixSolveFixedpointTypes(m,n,max_abs_A,max_abs_B,f); A = cast(A,'like',T.A); B = cast(B,'like',T.B); OutputType = fixed.extractNumericType(T.X);
model = 'ComplexBurstQlessQRMatrixSolveModel';
open_system(model);

Подсистема обработчика данных в этой модели принимает сложные матрицы A и B в качестве входных данных. ready порт запускает обработчик данных. После отправки true validIn сигнал, может быть некоторая задержка перед ready имеет значение false. Когда обработчик данных обнаруживает передний край ready сигнал, комплекты блоков validIn true и отправляет следующую строку A и B. Этот протокол позволяет отправлять данные всякий раз, когда передний край ready обнаруживается сигнал, обеспечивающий обработку всех данных.
Использовать функцию помощника setModelWorkspace для добавления переменных, определенных выше, в рабочее пространство модели. Эти переменные соответствуют параметрам блока для решения комплексной пакетной матрицы с использованием блока QR-декомпозиции без Q.
numSamples = 1; % Number of samples fixed.example.setModelWorkspace(model,'A',A,'B',B,'m',m,'n',n,'p',p,... 'numSamples',numSamples,'OutputType',OutputType);
out = sim(model);
Комплексный матричный анализ пакетов с использованием блока QR-декомпозиции без Q выводит данные по одной строке за раз. При выводе строки результата блок устанавливает validOut к true. Строки X выводятся в том порядке, в котором они вычисляются, сначала последняя строка, поэтому для интерпретации результатов необходимо восстановить данные. Для восстановления матрицы X из выходных данных используйте вспомогательную функцию matrixSolveModelOutputToArray.
X = fixed.example.matrixSolveModelOutputToArray(out.X,n,p);
Чтобы оценить точность решения комплексной пакетной матрицы с помощью блока QR-декомпозиции без Q, вычислите относительную ошибку.
relative_error = norm(double(A'*A*X - B))/norm(double(B)) %#ok<NOPTS>
relative_error = 2.5932e-04