Передайте отдельные комплексные числа функциям ФОРТРАН

MATLAB® сохраняет комплексные числа так же, как и Фортран, в одном векторе, pa, с реальной и мнимой частями, чередующимися.

До MATLAB Version 9.4 (R2018a) MATLAB хранил комплексные числа по-другому, чем Фортран, в отдельных векторах равной длины pr и pi. В результате комплексные переменные, обменивающиеся между этими версиями MATLAB и функцией Фортрана, несовместимы. MATLAB предоставляет примеры стандартных программ преобразования mat2fort и fort2mat которые изменяют формат хранения сложных номеров, чтобы устранить эту несовместимость. The fort.h заголовочный файл определяет mat2fort и fort2mat функций. Исходный код находится в fort.c файл.

  • mat2fort - Преобразуйте MATLAB отдельную комплексную матрицу в комплексное хранилище Фортран.

  • fort2mat - Преобразуйте комплексное хранилище Фортран в MATLAB, разделяющее реальную и мнимую части.

Чтобы использовать эти стандартные программы:

  1. Включите fort.h заголовочный файл в исходном файле, используя оператор #include "fort.h".

  2. Соедините fort.c файл с вашей программой. Задайте полный путь, matlabroot/extern/examples/refbook для fort.c в команде build.

  3. Чтобы указать заголовочный файл, используйте pathname -I переключатель. Задайте полный путь, matlabroot/extern/examples/refbook для fort.h в команде build.

  4. Когда вы задаете полный путь, замените термин matlabroot с фактическим именем папки.

  5. Создайте функцию, используя mex -R2017b опция.

Обработка входных значений комплексного числа

Нет необходимости копировать аргументы для функций, которые используют комплексные значения входа числа. The mat2fort стандартная программа преобразования создает копию аргументов для вас. Для получения дополнительной информации смотрите Сохранить входные значения из изменения.

Обработка выходных аргументов комплексного числа

Для комплексных переменных, возвращенных функцией Фортрана, выполните следующее:

  1. При выделении хранилища для переменной выделите вещественную переменную с вдвое большим пространством, чем для переменной того же размера. Сделайте это, потому что возвращенная переменная использует формат Фортран, который занимает вдвое больше места. Смотрите распределение zout в примере.

  2. Чтобы сделать переменную совместимой с MATLAB, используйте fort2mat функция.

Передайте комплексные переменные - matrixDivideComplex

Этот пример показывает, как вызвать функцию, передающую сложные prhs[0] как входной и приемный комплексные plhs[0] как вывод. Временные переменные zin и zout содержат вход и выходные значения в формате Фортран. Чтобы увидеть пример, откройте matrixDivideComplex.c в редакторе MATLAB. Чтобы создать файл MEX, скопируйте исходный файл в папку с возможностью записи.

copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivideComplex.c'),'.')

Создайте переменные, определяющие местоположение fort.c файл и его заголовочный файл.

fortfile = fullfile(matlabroot,'extern','examples','refbook','fort.c');
fortheaderdir = fullfile(matlabroot,'extern','examples','refbook');

Создайте MEX-функцию.

mex('-v','-R2017b',['-I' fortheaderdir],'matrixDivideComplex.c',fortfile,'-lmwlapack')

Протестируйте функцию.

Areal = [1 2; 3 4];
Aimag = [1 1; 0 0];
Breal = [5; 6];
Bimag = [0; 0];
Acomplex = complex(Areal,Aimag);
Bcomplex = complex(Breal,Bimag);
X = matrixDivideComplex(Acomplex,Bcomplex)
X =
  -4.4000 + 0.8000i
   4.8000 - 0.6000i

Handle Complex Return Type - dotProductComplex

Некоторые функции BLAS уровня 1 (для примера, zdotu и zdotc) вернуть double complex введите, который не поддерживается языком С. Следующий файл MEX на C, dotProductComplex.c, показывает, как обработать комплексный тип возврата Фортран для функции zdotu. Чтобы увидеть пример, откройте dotProductComplex.c в редакторе MATLAB.

Синтаксис вызова для программы на C, вызывающей функцию Фортрана, которая возвращает значение в выходном аргументе, зависит от платформы. В Windows® и платформы Mac, передайте возврат значение как первый входной параметр. MATLAB предоставляет макрос, FORTRAN_COMPLEX_FUNCTIONS_RETURN_VOID, чтобы справиться с этими различиями.

The dotProductComplex пример вычисляет точечный продукт X каждого элемента двух комплексных векторов A и B. Синтаксис вызова:

X = dotProductComplex(A,B)

где A и B являются комплексными векторами одного размера и X является комплексным скаляром.

Для примера создать:

copyfile(fullfile(matlabroot,'extern','examples','refbook','dotProductComplex.c'),'.')
fortfile = fullfile(matlabroot,'extern','examples','refbook','fort.c');
fortheaderdir = fullfile(matlabroot,'extern','examples','refbook');
mex('-v','-R2017b',['-I' fortheaderdir],'dotProductComplex.c',fortfile,'-lmwblas')

Для тестирования, тип;

a1 = [1+2i; 2+3i];
b1 = [-1+2i; -1+3i];
X = dotProductComplex(a1,b1)
X =
  -16.0000 + 3.0000i

Симметричная неопределенная факторизация с использованием LAPACK - utdu_slv

Пример utdu_slv.c вызывает функции LAPACK zhesvx и dsysvx. Чтобы увидеть пример, откройте utdu_slv.c в редакторе MATLAB. Чтобы создать файл MEX, скопируйте исходный файл в папку с возможностью записи.

copyfile(fullfile(matlabroot,'extern','examples','refbook','utdu_slv.c'),'.')

Чтобы создать:

fortheaderdir = fullfile(matlabroot,'extern','examples','refbook');
mex('-v','-R2017b',['-I' fortheaderdir],'utdu_slv.c',fortfile,'-lmwlapack')