Функцию LAPACK или BLAS можно вызвать с помощью файла MEX. Для создания MEX-файла необходим опыт программирования C/C + + или Fortran и программные ресурсы (компиляторы и линкеры) для построения исполняемого файла. Также полезно понять, как использовать подпрограммы Fortran. MATLAB ® обеспечивает mwlapack и mwblas библиотеки в matlabroot/extern/lib. Чтобы помочь вам начать работу, есть примеры исходного кода в matlabroot/extern/examples/refbook.
Для вызова функций LAPACK или BLAS:
Создайте исходный файл MEX, содержащий mexFunction подпрограмма шлюза.
Убедитесь, что для вашей платформы поддерживается компилятор. Обновленный список поддерживаемых компиляторов см. в разделе Поддерживаемые и совместимые компиляторы.
Создайте двоичный файл MEX с помощью mex команда и отдельный флаг сборки комплекса -R2017b.
Свяжите исходный файл с одной или обеими библиотеками. mwlapack и mwblas.
mwlapack и mwblas библиотеки поддерживают только 64-разрядные целые числа для матричных размеров. Не используйте -compatibleArrayDims вариант.
Чтобы создать файл MEX с функциями, использующими комплексные номера, см. раздел Передача отдельных комплексных номеров функциям Fortran.
Для получения информации о функциях BLAS или LAPACK см. https://www.netlib.org/blas/ или https://www.netlib.org/lapack/.
matrixMultiply Функция MEX с использованием функций BLASВ этом примере показано, как построить пример файла MEX matrixMultiply.c, которая использует функции из библиотеки BLAS. Для работы с этим файлом скопируйте его в локальную папку. Например:
copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixMultiply.c'),'.')
Файлы примеров доступны только для чтения. Чтобы изменить пример, убедитесь, что файл доступен для записи, введя:
fileattrib('matrixMultiply.c','+w')
Чтобы построить файл MEX, введите:
mex -v -R2017b matrixMultiply.c -lmwblas
Чтобы запустить файл MEX, введите:
A = [1 3 5; 2 4 7]; B = [-5 8 11; 3 9 21; 4 0 8]; X = matrixMultiply(A,B)
X =
24 35 114
30 52 162
Многие функции LAPACK и BLAS изменяют значения переданных им аргументов. Рекомендуется создавать копии аргументов, которые можно изменить, прежде чем передавать их этим функциям. Для получения информации о том, как MATLAB обрабатывает аргументы в mexFunctionсм. раздел Управление параметрами ввода и вывода.
matrixDivide ПримерВ этом примере вызывается функция LAPACK. dgesv изменяет входные аргументы. Код в этом примере создает копии prhs[0] и prhs[1]и передает копии в dgesv для сохранения содержимого входных аргументов.
Чтобы увидеть пример, откройте matrixDivide.c в редакторе MATLAB. Чтобы создать файл MEX, скопируйте исходный файл в папку с возможностью записи.
copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivide.c'),'.')
Чтобы построить файл, введите:
mex -v -R2017b matrixDivide.c -lmwlapack
Для тестирования введите:
A = [1 2; 3 4]; B = [5; 6]; X = matrixDivide(A,B)
X =
-4.0000
4.5000
Функции LAPACK и BLAS написаны на языке фортран. C/C + + и Fortran используют различные условные обозначения для передачи аргументов в функции и из функций. Функции Fortran передают аргументы по ссылке, а функции C/C + + передают аргументы по значению. При прохождении по значению передается копия значения. При передаче по ссылке передается указатель на значение. Ссылка также является адресом значения.
При вызове подпрограммы Fortran, подобно функции из LAPACK или BLAS, из программы C/C + + обязательно передайте аргументы по ссылке. Для передачи по ссылке, предшествуйте аргументу амперсандом (&), если только этот аргумент уже не является ссылкой. Например, при создании матрицы с помощью mxGetDoubles функция создает ссылку на матрицу и не нуждается в амперсанде перед аргументом.
В следующем фрагменте кода переменные m, n, p, one, и zero требуется & символ, чтобы сделать их ссылкой. Переменные A, B, C, и chn - указатели, являющиеся ссылками.
/* pointers to input & output matrices*/ double *A, *B, *C; /* matrix dimensions */ mwSignedIndex m,n,p; /* other inputs to dgemm */ char *chn = "N"; double one = 1.0, zero = 0.0; /* call BLAS function */ dgemm(chn, chn, &m, &n, &p, &one, A, &m, B, &p, &zero, C, &m);
matrixMultiply Пример matrixMultiply.c примеры вызовов dgemm, передавая все аргументы по ссылке. Чтобы просмотреть исходный код, откройте matrixMultiply.c в редакторе MATLAB. Для создания и выполнения этого примера см. раздел Создание матрицы умножение функции MEX с использованием функций BLAS.
Функции LAPACK и BLAS можно вызывать из файлов Fortran MEX. Следующий пример берет две матрицы и умножает их на вызов подпрограммы BLAS dgemm. Чтобы запустить пример, скопируйте код в редактор и присвойте файлу имя calldgemm.F.
#include "fintrf.h"
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
mwPointer plhs(*), prhs(*)
integer nlhs, nrhs
mwPointer mxcreatedoublematrix
mwPointer mxgetpr
mwPointer A, B, C
mwSize mxgetm, mxgetn
mwSignedIndex m, n, p
mwSize numel
double precision one, zero, ar, br
character ch1, ch2
ch1 = 'N'
ch2 = 'N'
one = 1.0
zero = 0.0
A = mxgetpr(prhs(1))
B = mxgetpr(prhs(2))
m = mxgetm(prhs(1))
p = mxgetn(prhs(1))
n = mxgetn(prhs(2))
plhs(1) = mxcreatedoublematrix(m, n, 0.0)
C = mxgetpr(plhs(1))
numel = 1
call mxcopyptrtoreal8(A, ar, numel)
call mxcopyptrtoreal8(B, br, numel)
call dgemm(ch1, ch2, m, n, p, one, %val(A), m,
+ %val(B), p, zero, %val(C), m)
return
end
Ссылка на библиотеку BLAS, содержащую dgemm функция.
mex -v -R2017b calldgemm.F -lmwblas
Добавьте символ подчеркивания после имени функции при вызове функций LAPACK или BLAS в системе UNIX ®. Например, для вызоваdgemm, использовать:
dgemm_(arg1, arg2, ..., argn);
Или добавьте следующие строки в исходный код:
#if !defined(_WIN32) #define dgemm dgemm_ #endif