MATLAB ® хранит комплексные числа так же, как Fortran, в одном векторе ,pa, с перемежающейся действительной и мнимой частями.
До MATLAB версии 9.4 (R2018a) MATLAB хранил комплексные числа иначе, чем Fortran, в отдельных векторах равной длины pr и pi. В результате сложные переменные, которыми обмениваются эти версии MATLAB и функции Фортрана, несовместимы. MATLAB предоставляет примеры процедур преобразования mat2fort и fort2mat которые изменяют формат хранения комплексных чисел для устранения этой несовместимости. fort.h файл заголовка определяет mat2fort и fort2mat функции. Исходный код находится в fort.c файл.
mat2fort - Преобразование отдельной комплексной матрицы MATLAB в комплексное хранилище Fortran.
fort2mat - Преобразование комплекса хранения Fortran в MATLAB отдельных реальных и воображаемых частей.
Для использования этих процедур:
Включить fort.h файл заголовка в исходном файле, используя инструкцию #include "fort.h".
Связать fort.c файл с программой. Укажите полный путь, matlabroot/extern/examples/refbook для fort.c в команде build.
Чтобы указать файл заголовка, используйте -I переключатель. Укажите полный путь, pathnamematlabroot/extern/examples/refbook для fort.h в команде build.
При указании полного пути замените термин matlabroot с фактическим именем папки.
Создайте функцию с помощью mex
-R2017b вариант.
Нет необходимости копировать аргументы для функций, использующих входные значения комплексных чисел. mat2fort программа преобразования создает копию аргументов для вас. Дополнительные сведения см. в разделе Сохранение входных значений из изменения.
Для комплексных переменных, возвращаемых функцией Фортрана, выполните следующие действия:
При выделении хранилища для переменной следует выделить реальную переменную с вдвое большим объемом пространства, чем для переменной того же размера. Это происходит потому, что возвращаемая переменная использует формат Фортрана, который занимает вдвое больше места. См. распределение zout в примере.
Чтобы сделать переменную совместимой с MATLAB, используйте fort2mat функция.
matrixDivideComplexВ этом примере показано, как вызвать функцию, передавая сложную prhs[0] в качестве комплекса ввода и приема plhs[0] в качестве выходного. Временные переменные zin и zout содержат входные и выходные значения в формате Fortran. Чтобы увидеть пример, откройте 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) вернуть a double complex тип, который язык C не поддерживает. Следующий файл C MEX, dotProductComplex.c, показывает, как обрабатывать комплексный возвращаемый тип Fortran для функции 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')