在 Fortran 中导入 .mat 文件 - 分段错误错误
Posted
技术标签:
【中文标题】在 Fortran 中导入 .mat 文件 - 分段错误错误【英文标题】:Importing .mat file in Fortran - Segmentation Fault error 【发布时间】:2015-10-19 14:14:29 【问题描述】:我正在编写这个 F90 程序来计算一个 fortran 中的函数,该函数从 .mat 文件中获取输入并将结果保存在另一个 .mat 文件中。
我按照this 的回答来编译并正确链接代码。这是我的 makefile 命令:
gfortran -g -fcheck=all binhkorn_mat.F90 -I/usr/local/MATLAB/R2015b/extern/include/ -L/usr/local/MATLAB/R2015b/bin/glnxa64 -cpp -o binhkorn_mat -lmat -lmx -Wl,-rpath /usr/local/MATLAB/R2015b/bin/glnxa64/
输出文件显然是正确编译的,但是一旦我运行程序,就会出现以下 SF(我正在使用 LINUX Ubuntu 14.04 LTS):
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0x7FD650063F27
#1 0x7FD6500644F4
#2 0x7FD64FCBCD3F
#3 0x7FD64FDD7AF6
#4 0x400A3F in binhkorn_mat at binhkorn_mat.F90:17 (discriminator 2)
./binhkorn_mat: Segmentation fault
我无法确定编译器是否存在错误,或者我的指针/函数定义是否有问题。这是代码(binhkorn_mat.F90):
#include "fintrf.h"
PROGRAM binhkorn_mat
IMPLICIT NONE
mwPointer matOpen, matGetVariable, matPutVariable
mwPointer mpin, mpX, mpout, mpcf
INTEGER :: i,j
REAL*8, DIMENSION(2) :: x
REAL*8, DIMENSION(4) :: cf
!input/output through .mat f
mpin = matOpen('X.mat', 'u')
mpX = matGetVariable(mpin, 'X')
CALL mxCopyPtrToReal8(mpX, x, 2)
CALL matClose(mpin)
!fitness functions
cf(1) = ((x(1)-2)**2 + (x(2)-1)**2 + 2)
cf(2) = (9*x(1) + (x(2)-1)**2)
!constraints
cf(3) = x(1)*x(1) + x(2)*x(2) - 225
cf(4) = x(1) - 3*x(2) + 10
!output file created
CALL mxCopyReal8ToPtr(cf, mpcf, 4)
mpout = matOpen('cf.mat', 'w')
mpcf = matPutVariable(mpout, 'cf', mpcf)
CALL matClose(mpout)
END PROGRAM
X.mat 文件由外部 Matlab 脚本正确创建,并包含一个名为 X
的变量,它是一个 2 元素行向量。
【问题讨论】:
哇。用 Fortran 90 编写的人已经不多了…… @GameOfThrows 是的,Fortran 90 来自上个世纪,我们今天使用 Fortran 2008。 你能打印matGetVariable(mpin, 'X')
返回的值并检查它不为零吗?
嗨,我打印了指针mpin和mpX的值。这是我得到的:27594832 140580543152016
我想这些是(虚拟?)以整数表示的内存地址?
【参考方案1】:
我基本上误解了如何使用许多功能。我作为输入提供给其中一些的指针不是正确的。我在这里发布工作解决方案:
#include "fintrf.h"
PROGRAM binhkorn_mat
IMPLICIT NONE
mwPointer matOpen, matGetVariable!, matPutVariable
mwPointer mxGetData, mxGetNumberOfElements, mxCreateNumericArray
mwPointer mpin, mpX, mpout, mpcf
mwSize ndim
mwSize dims(2)
INTEGER :: s
INTEGER*4 mxClassIDFromClassName
CHARACTER (LEN = 6) :: classname
REAL*8, DIMENSION(2) :: x
REAL*8, DIMENSION(4) :: cf
!input/output through .mat f
mpin = matOpen('X.mat', 'r')
mpX = matGetVariable(mpin, 'X')
CALL mxCopyPtrToReal8(mxGetData(mpX), x, mxGetNumberOfElements(mpX))
!CALL matClose(mpin)
!fitness functions
cf(1) = ((x(1)-2)**2 + (x(2)-1)**2 + 2)
cf(2) = (9*x(1) + (x(2)-1)**2)
!constraints
cf(3) = x(1)*x(1) + x(2)*x(2) - 225
cf(4) = x(1) - 3*x(2) + 10
!output .mat file created and filled
s = size(cf)
ndim = 2
classname = 'double'
dims(1) = 1
dims(2) = s
mpcf = mxCreateNumericArray(ndim, dims, mxClassIDFromClassName(classname), 0)
CALL mxCopyReal8ToPtr(cf, mxGetData(mpcf), mxGetNumberOfElements(mpcf))
mpout = matOpen('cf.mat', 'w')
CALL matPutVariable(mpout, 'cf', mpcf)
!CALL matClose(mpout)
END PROGRAM
【讨论】:
以上是关于在 Fortran 中导入 .mat 文件 - 分段错误错误的主要内容,如果未能解决你的问题,请参考以下文章