LAPACK과 BLAS 함수 호출하기
MEX 파일을 사용하여 LAPACK 또는 BLAS 함수를 호출할 수 있습니다. MEX 파일을 만들려면 C/C++ 또는 Fortran 프로그래밍 경험과 실행 파일을 빌드하기 위한 소프트웨어 리소스(컴파일러와 링커)가 필요합니다. Fortran 서브루틴 사용 방법을 이해하는 것도 도움이 됩니다. MATLAB®은 matlabroot
/extern/lib
에 mwlapack
및 mwblas
라이브러리를 제공합니다. 시작하는 데 도움이 되도록 matlabroot
/extern/examples/refbook
에 소스 코드 예제가 들어 있습니다.
LAPACK 또는 BLAS 함수를 호출하려면 다음을 수행하십시오.
mexFunction
게이트웨이 루틴이 포함된 소스 MEX 파일을 만듭니다.사용 중인 플랫폼에 대해 지원되는 컴파일러가 있는지 확인합니다. 지원되는 컴파일러의 최신 목록을 보려면 지원 및 호환되는 컴파일러를 참조하십시오.
mex
명령과 실수부/허수부 분리형의 복소수 빌드 플래그-R2017b
를 사용하여 이진 MEX 파일을 빌드합니다.라이브러리
mwlapack
과mwblas
중 하나 또는 둘 모두에 소스 파일을 링크합니다.mwlapack
및mwblas
라이브러리는 행렬 차원에 대해 64비트 정수만 지원합니다.-compatibleArrayDims
옵션은 사용하지 마십시오.복소수를 사용하는 함수를 갖는 MEX 파일을 빌드하려면 Pass Separate Complex Numbers to Fortran Functions 항목을 참조하십시오.
BLAS 또는 LAPACK 함수에 대한 자세한 내용은 https://netlib.org/blas/ 또는 https://netlib.org/lapack/ 항목을 참조하십시오.
BLAS 함수를 사용하는 matrixMultiply
MEX 함수 빌드하기
이 예제에서는 BLAS 라이브러리의 함수를 사용하는 예제 MEX 파일 matrixMultiply.c
를 빌드하는 방법을 보여줍니다. 이 파일로 작업하려면 파일을 로컬 폴더로 복사하십시오. 예를 들어, 다음과 같이 입력합니다.
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
에 대한 인수를 처리하는 방법에 대한 자세한 내용은 Managing Input and Output Parameters 항목을 참조하십시오.
matrixDivide
예제
이 예제에서는 입력 인수를 수정하는 LAPACK 함수 dgesv
를 호출합니다. 이 예제의 코드는 입력 인수의 내용을 유지하기 위해 prhs[0]
과 prhs[1]
의 복사본을 만든 다음 이들 복사본을 dgesv
에 전달합니다.
예제를 보려면 MATLAB 편집기에서 matrixDivide.c
를 여십시오. 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
C/C++ 프로그램에서 Fortran 함수에 인수 전달하기
LAPACK 함수와 BLAS 함수는 Fortran으로 작성되었습니다. C/C++와 Fortran은 인수를 함수에 전달하거나 함수에서 인수를 전달받는 데 서로 다른 규칙을 사용합니다. Fortran 함수는 참조 방식으로 인수를 전달하는 반면, C/C++ 함수는 값 방식으로 인수를 전달합니다. 값 방식으로 전달할 때는 값의 복사본을 전달합니다. 참조 방식으로 전달할 때는 값에 대한 포인터를 전달합니다. 참조는 값의 주소이기도 합니다.
LAPACK 또는 BLAS의 함수 같은 Fortran 서브루틴을 호출할 때는 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
을 호출하고, 모든 인수를 참조 방식으로 전달합니다. 소스 코드를 보려면 MATLAB 편집기에서 matrixMultiply.c
를 여십시오. 이 예제를 빌드하고 실행하려면 BLAS 함수를 사용하는 matrixMultiply MEX 함수 빌드하기 항목을 참조하십시오.
Fortran 프로그램에서 Fortran 함수에 인수 전달하기
Fortran MEX 파일에서 LAPACK 함수와 BLAS 함수를 호출할 수 있습니다. 다음 예제에서는 두 개의 행렬을 가져온 후 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
dgemm
함수가 들어 있는 BLAS 라이브러리에 링크합니다.
mex -v -R2017b calldgemm.F -lmwblas
UNIX 시스템에서 함수 이름 수정하기
UNIX® 시스템에서 LAPACK 또는 BLAS 함수를 호출할 경우 함수 이름 다음에 밑줄 문자를 추가하십시오. 예를 들어, dgemm
을 호출하려면 다음을 사용하십시오.
dgemm_(arg1, arg2, ..., argn);
또는 소스 코드에 다음 라인을 추가합니다.
#if !defined(_WIN32) #define dgemm dgemm_ #endif