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

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

Перед MATLAB Version 9.4 (R2018a) MATLAB сохранил комплексные числа по-другому, чем Фортран в отдельных векторах равной длины pr и pi. В результате комплексные переменные, которыми обмениваются между теми версиями MATLAB и функции Фортрана, несовместимы. MATLAB предоставляет подпрограммам преобразования в качестве примера mat2fort и fort2mat то изменение формат устройства хранения данных комплексных чисел, чтобы обратиться к этой несовместимости. 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 в команде сборки.

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

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

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

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

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

Некоторый уровень 1 функции BLAS (например, 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')