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

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

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

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

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

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

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

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

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

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

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

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

Является ненужным скопировать аргументы для функций то комплексное число использования входные значения. Подпрограмма преобразования 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

Обработайте Фортран комплексный тип возврата — dotProductComplex

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

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

Пример 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')