В этом примере показано, как реализовать аппаратно эффективное решение для комплексного матричного уравнения A 'AX = B с использованием комплексного частичного систолического матричного решения с использованием блока QR-декомпозиции без Q.
Укажите количество строк в матрице A, количество столбцов в матрице A и строк в матрице B и количество столбцов в матрице B.
m = 300; % 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 = 'ComplexPartialSystolicQlessQRMatrixSolveModel';
open_system(model);

Подсистема обработчика данных в этой модели принимает сложные матрицы A и B в качестве входных данных. readyA и readyB порты запускают обработчик данных. После посылки сигнала true validIn может возникнуть некоторая задержка, прежде чем значение ready станет false. Когда обработчик данных обнаруживает передний край readyA сигнал, комплекты блоков validInA true и отправляет следующую строку A. Когда обработчик данных обнаруживает передний край readyB сигнал, комплекты блоков validInB true и отправляет следующую матрицу B. Этот протокол позволяет отправлять данные всякий раз, когда обнаруживается передний фронт сигнала готовности, гарантируя, что все данные будут обработаны.
Использовать функцию помощника 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 выводит матрицу X на каждом временном шаге. При выводе допустимой матрицы результатов блок устанавливает validOut к true.
X = out.X;
Чтобы оценить точность решения комплексной частично-систолической матрицы с использованием блока QR-декомпозиции без Q, вычислите относительную ошибку.
relative_error = norm(double(A'*A*X - B))/norm(double(B)) %#ok<NOPTS>
relative_error = 1.5587e-04