MATLAB® хранит комплексные числа тот же путь как Фортран, в одном векторе, pa, с действительными и чередованными мнимыми частями.
Перед MATLAB Version 9.4 (R2018a) MATLAB сохранил комплексные числа по-другому, чем Фортран в отдельных векторах равной длины pr и pi. В результате комплексные переменные, которыми обмениваются между теми версиями MATLAB и функции Фортрана, несовместимы. MATLAB предоставляет подпрограммам преобразования в качестве примера mat2fort и fort2mat то изменение формат устройства хранения данных комплексных чисел, чтобы обратиться к этой несовместимости. fort.h заголовочный файл задает mat2fort и fort2mat функции. Исходный код находится в fort.c файл.
mat2fort — Преобразуйте MATLAB отдельная комплексная матрица в устройство хранения данных комплекса Фортрана.
fort2mat — Преобразуйте устройство хранения данных комплекса Фортрана в отдельные действительные и мнимые части MATLAB.
Использовать эти стандартные программы:
Включайте fort.h заголовочный файл в вашем исходном файле, с помощью оператора #include "fort.h".
Соедините fort.c файл с вашей программой. Задайте полный путь, matlabroot/extern/examples/refbook для fort.c в команде сборки.
Чтобы указать на заголовочный файл, используйте-I переключатель. Задайте полный путь, pathnamematlabroot/extern/examples/refbook для fort.h в команде сборки.
Когда вы задаете полный путь, заменяете термин matlabroot с фактическим именем папки.
Создайте функцию с помощью mex
-R2017b опция.
Является ненужным скопировать аргументы для функций то комплексное число использования входные значения. mat2fort подпрограмма преобразования создает копию аргументов для вас. Для получения информации смотрите Входные значения Заповедника от Модификации.
Для комплексных переменных, возвращенных функцией Фортрана, сделайте следующее:
При выделении устройства хранения данных для переменной выделите действительную переменную с вдвое большим количеством пробела, как вы были бы для переменной, одного размера. Сделайте это, потому что возвращенная переменная использует формат Фортрана, который занимает дважды место. Смотрите выделение zout в примере.
Чтобы сделать переменную совместимой с 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
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')