Вы можете вызвать функцию LAPACK или BLAS с помощью файла MEX. Чтобы создать файл MEX, вам нужен опыт программирования на C/C + + или Фортран и программные ресурсы (компиляторы и линкеры), чтобы создать исполняемый файл. Также полезно понять, как использовать стандартные подпрограммы Фортран. MATLAB® предоставляет mwlapack
и mwblas
библиотеки в matlabroot
/extern/lib
. Чтобы помочь вам начать, существуют примеры исходного кода в matlabroot
/extern/examples/refbook
.
Вызов функций LAPACK или BLAS:
Создайте исходный файл MEX, содержащий mexFunction
шлюз стандартной программы.
Убедитесь, что у вас есть поддерживаемый компилятор для вашей платформы. Обновленный список поддерживаемых компиляторов см. в Поддерживаемые и совместимые компиляторы.
Создайте двоичный файл MEX с помощью mex
команда и отдельный комплексный флаг сборки -R2017b
.
Связать исходный файл с одной или обеими библиотеками, mwlapack
и mwblas
.
The mwlapack
и mwblas
библиотеки поддерживают только 64-разрядные целые числа для матричных размерностей. Не используйте -compatibleArrayDims
опция.
Чтобы создать файл MEX с функциями, которые используют комплексные числа, смотрите Передайте отдельные комплексные числа в функции Фортрана.
Для получения информации о функциях 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 + + и Фортран используют различные соглашения для передачи аргументов в функции и из них. Функции ФОРТРАН передают аргументы по ссылкам, в то время как функции C/C + + передают аргументы по значению. Когда вы передаете значение, вы передаете копию значения. Когда вы проходите мимо ссылки, вы передаете указатель на значение. Ссылка также является адресом значения.
При вызове стандартной подпрограммы Фортран, как функция из 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
ПримерThe matrixMultiply.c
пример вызовов dgemm
, передача всех аргументов по ссылке. Чтобы увидеть исходный код, откройте matrixMultiply.c
в редакторе MATLAB. Чтобы создать и запустить этот пример, смотрите Build matrixMultiply MEX-функция Using BLAS Functions.
Можно вызвать функции LAPACK и BLAS из файлов 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