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