Мне нужно использовать функцию mxCalloc вместо регулярного выделения в файле mex, чтобы избежать сбой mlabab при использовании dgesv. Я пробовал много способов, но никто из них не работал. Вот один из образцовКак использовать mxCalloc в mex-файле fortran
#include "fintrf.h"
C Gateway subroutine
subroutine mexfunction(nlhs, plhs, nrhs, prhs)
C Declarations
implicit none
C mexFunction arguments:
mwPointer plhs(*), prhs(*)
integer nlhs, nrhs
C Function declarations:
mwPointer mxGetPr
mwPointer mxCreateDoubleMatrix
mwPointer mxGetM
C Pointers to input/output mxArrays:
mwPointer pr_A, pr_B
C Array information:
mwPointer sizea,mxCalloc
real*8 :: A,B
character*120 :: line
C Get the size of the input array.
sizea = mxGetM(prhs(1))
A=mxCalloc(sizea*sizea,8)
B=mxCalloc(sizea*sizea,8)
C Create Fortran array from the input argument.
pr_A = mxGetPr(prhs(1))
call mxCopyPtrToReal8(pr_A,A,sizea**2)
C Create matrix for the return argument.
plhs(1) = mxCreateDoubleMatrix(sizea, sizea, 0)
pr_B = mxGetPr(plhs(1))
write(line,*), sizea
call mexPrintf(line)
B=A
call mxCopyReal8ToPtr(B,pr_B,sizea*sizea)
return
end
, когда я запускаю этот код, я получаю следующий результат
A = [0,9575, 0,1576; 0,9649, 0,9706]
test (A) = [0.9575, 0; 0,9649, 0]
но если я изменить линию call mxCopyReal8ToPtr(B,pr_B,sizea*sizea)
к
call mxCopyReal8ToPtr(A,pr_B,sizea*sizea)
, результаты являются правильными
переменная sizea равно 2, который является правильным, но я не могу доступ любой член A, скажем A (1,1), и имеет ошибку, с которой я сталкиваюсь:
ошибка # 6410: Это имя не было объявлено как массив или функция . [A]
Большое спасибо за вашу помощь. Кажется, это нормально – Ali
, но я все еще не могу использовать dgesv, есть ли у вас какие-нибудь идеи? – Ali
Пожалуйста, напишите минимальный пример кода, в котором вы используете dgesv. Невозможно сказать, что может быть неправильным, не видя фактического кода. И я думаю, что было бы неплохо сделать это в другом вопросе, так как ваш оригинальный «Как использовать mxCalloc в mex-файле fortran», похоже, был решен этим ответом. – ftiaronsem