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