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