exponenta event banner

Передача отдельных комплексных номеров функциям Fortran

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 отдельных реальных и воображаемых частей.

Для использования этих процедур:

  1. Включить fort.h файл заголовка в исходном файле, используя инструкцию #include "fort.h".

  2. Связать fort.c файл с программой. Укажите полный путь, matlabroot/extern/examples/refbook для fort.c в команде build.

  3. Чтобы указать файл заголовка, используйте -Ipathname переключатель. Укажите полный путь, matlabroot/extern/examples/refbook для fort.h в команде build.

  4. При указании полного пути замените термин matlabroot с фактическим именем папки.

  5. Создайте функцию с помощью mex -R2017b вариант.

Обработка входных значений комплексных номеров

Нет необходимости копировать аргументы для функций, использующих входные значения комплексных чисел. mat2fort программа преобразования создает копию аргументов для вас. Дополнительные сведения см. в разделе Сохранение входных значений из изменения.

Обработка выходных аргументов комплексного номера

Для комплексных переменных, возвращаемых функцией Фортрана, выполните следующие действия:

  1. При выделении хранилища для переменной следует выделить реальную переменную с вдвое большим объемом пространства, чем для переменной того же размера. Это происходит потому, что возвращаемая переменная использует формат Фортрана, который занимает вдвое больше места. См. распределение zout в примере.

  2. Чтобы сделать переменную совместимой с 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

Обработать комплексный тип возврата Fortran - 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

Симметричная неопределенная факторизация с использованием LAPACK - 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')