Ubuntu下Fortran与MATLAB协同工作
一、常用协同方式概览
二、MATLAB 调用 Fortran
三、Fortran 调用 MATLAB
四、数据文件交换与格式选择
五、Ubuntu快速上手示例
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
use, intrinsic :: iso_c_binding, only: c_ptr, c_loc
implicit none
integer, intent(in) :: nlhs, nrhs
type(c_ptr), intent(in) :: prhs(*)
type(c_ptr), intent(out) :: plhs(*)
! 简化示例:C = A + B(均为列向量)
real(8), pointer :: A(:), B(:), C(:)
integer :: m, n
! 获取输入 mxArray 并转为 Fortran 指针(实际项目应使用 mxGetPr/mxGetDimensions 等)
! 这里省略错误检查与维度校验,生产代码需完善
call mxCopyPtrToReal8(mxGetPr(prhs(1)), A, size(A))
call mxCopyPtrToReal8(mxGetPr(prhs(2)), B, size(B))
m = size(A); n = size(B)
if (m /= n) call mexErrMsgIdAndTxt('MATLAB:addvec:dimMismatch','A and B must match')
allocate(C(m))
C = A + B
! 创建输出 mxArray 并拷贝数据(示意)
plhs(1) = mxCreateDoubleMatrix(m, 1, 0)
call mxCopyReal8ToPtr(C, mxGetPr(plhs(1)), m)
deallocate(C)
end subroutine mexFunction
mex -v addvec.f90
A = randn(5,1); B = randn(5,1);
C = addvec(A,B);
program read_mat
use hdf5
implicit none
integer(hid_t) :: file_id, dset_id, memspace, filespace
integer(hsize_t) :: dims(2) = [100, 100]
real, allocatable :: data(:, :)
integer :: err
call h5open_f(err)
call h5fopen_f('data.mat', H5F_ACC_RDONLY_F, file_id, err)
call h5dopen_f(file_id, '/your_variable_name', dset_id, err) ! 替换为实际变量名
call h5dread_f(dset_id, H5T_NATIVE_DOUBLE, data, dims, err)
call h5dclose_f(dset_id, err)
call h5fclose_f(file_id, err)
call h5close_f(err)
print *, 'data(1,1)=', data(1,1)
end program read_mat
gfortran -o read_mat read_matlab_hdf5.f90 -lhdf5 -I/usr/include/hdf5/fortran
./read_mat