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
переключатель. Задайте полный путь, pathname
matlabroot
/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')