如何在matlab中创建m文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在matlab中创建m文件相关的知识,希望对你有一定的参考价值。

参考技术A MATLAB的m文件分为两种,
1、脚本文件,就是由一堆命令构成的,里面第一行不是 function 开头,这种文件比如是name.m 就在命令窗口里输入name回车就行;
2、函数文件,第一行为function ,比如说是function y = name(x)这种文件,函数名与文件名是一致的,在命令窗口里输入name(x),x是运行参数,回车即运行。
其中以function开头的一行为引导行,表示该M文件是一个函数。函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函数的输出型参数。当输出从形参多于一个时,则应该用方括号括起来。

function [s,p]=fcircle(r)
%
% r-圆半径
% s-圆面积
% p-圆周长

s=pi*r*r;
p=2*pi*r;
调用的方式调用方式: 在命令窗口输入 fcircle(5)即可。

实例:

1、创建M文件:新建函数



2、编写m文件

function s=sumsum(n)
s=0;
for i=1:n
s=s+i;
end
注意这里的保存路径

3、添加保存路径到目录下:在命令窗口输入如图所示:



cd紧跟为刚才m文件保存路径

4、直接调用sumsum函数即可

在 Windows 上使用 GFortran 在 Matlab 中创建 Mex 文件

【中文标题】在 Windows 上使用 GFortran 在 Matlab 中创建 Mex 文件【英文标题】:Creating Mex Files in Matlab with GFortran on Windows 【发布时间】:2017-03-17 21:17:22 【问题描述】:

我正在努力将 Fortran 例程添加到 Matlab 中(通过 Mex 函数)。我只是想编写一个简单的程序来了解 Matlab、Mex 和 Fortran 之间的链接是如何建立的。

我编写了一个简单的程序,它接收xy 的值,将它们相加并输出z。但是,当我在编译后尝试在 Matlab 中运行时,Matlab 只是在没有解释的情况下崩溃了。知道我在这里做错了什么吗?

! MEX FILE EXAMPLE
!


module yprime_mod ! test module for gnumex and g95
  use mexinterface
contains
  subroutine yprime(x, y, z) ! subroutine yprime(z, t, y, error, x)
    implicit none
    double precision :: x, y, z
    intent(in)  :: x, y
    intent(out) :: z
    ! 
    z=x+y;
  end subroutine yprime
end module yprime_mod

subroutine mexfunction(nlhs, plhs, nrhs, prhs)
  use yprime_mod
  implicit none
  integer :: nlhs, nrhs, plhs(nlhs), prhs(nrhs)
  double precision, pointer :: xp, yp, z
  !
  if (nrhs /= 2) call mexerrmsgtxt('yprime requires two input arguments')
  if (nlhs > 1) call mexerrmsgtxt('yprime requires one output argument')
  call c_f_pointer(mxgetpr(prhs(1)), xp)  ! assign pointers to parameters
  call c_f_pointer(mxgetpr(prhs(2)), yp)
  call c_f_pointer(mxgetpr(plhs(1)), z)
  call yprime(xp, yp, z)
end subroutine mexfunction

【问题讨论】:

对于 p*hs 参数,默认的 Integer 类型是否足够大?尝试将它们声明为mwPointers。此外,如果您直接使用 MEX Fortran API 编译它(没有干预 C),我认为您不需要 c_f_pointer 你能看看basic example for Fortran source files是否有效吗? 嗨@Adam 请问你是如何强迫matlab使用gfortran的?我读到只支持(非常昂贵的)英特尔编译器,我还想强制 Matlab 改为依赖 gfortran。谢谢! 【参考方案1】:

在不了解 Fortran 的情况下,我遵循了基本示例,并且它正在工作。

我对使用c_f_pointer一无所知(可能与崩溃有关)。 我认为代码很可能会崩溃,因为您忘记调用plhs(1) = mxCreateDoubleMatrix(mrows,ncols,0) 来为返回参数创建矩阵。

这里是修改后的代码:

! MEX FILE EXAMPLE
!

#include "fintrf.h"

module yprime_mod ! test module for gnumex and g95
  !use mexinterface
contains
  subroutine yprime(x, y, z) ! subroutine yprime(z, t, y, error, x)
    implicit none
    double precision :: x, y, z
    intent(in)  :: x, y
    intent(out) :: z
    ! 
    z=x+y;
  end subroutine yprime
end module yprime_mod
!   
!    
subroutine mexfunction(nlhs, plhs, nrhs, prhs)
  use yprime_mod
  implicit none
  !integer :: nlhs, nrhs, plhs(nlhs), prhs(nrhs)
  !double precision, pointer :: xp, yp, zp
  !double precision x, y, z 

  !mexFunction arguments:
  mwPointer plhs(*), prhs(*)
  integer nlhs, nrhs

  !Function declarations:
  mwPointer mxGetPr
  mwPointer mxCreateDoubleMatrix
  mwPointer mxGetM, mxGetN

  !Pointers to input/output mxArrays:
  mwPointer xp, yp, zp

  !Arguments for computational routine:
  real*8 x, y, z

  if (nrhs /= 2) call mexerrmsgtxt('yprime requires two input arguments')
  if (nlhs > 1) call mexerrmsgtxt('yprime requires one output argument')

  !To points to the input matrices data, use the mxGetPr function.
  xp = mxGetPr(prhs(1))
  yp = mxGetPr(prhs(2))

  !Create Fortran arrays from the input arguments.
  call mxCopyPtrToReal8(xp,x,1)
  call mxCopyPtrToReal8(yp,y,1)

  !Create scalar for the return argument.
  plhs(1) = mxCreateDoubleMatrix(1,1,0)

  !Use the mxGetPr function to assign the y_ptr argument to plhs(1).
  zp = mxGetPr(plhs(1))

  !call c_f_pointer(mxgetpr(prhs(1)), xp)  ! assign pointers to parameters
  !call c_f_pointer(mxgetpr(prhs(2)), yp)
  !call c_f_pointer(mxgetpr(plhs(1)), z)

  !call yprime(xp, yp, zp)

  !Perform Calculation
  call yprime(x, y, z)

  !Copy Results to Output Argument
  call mxCopyReal8ToPtr(z,zp,1)

end subroutine mexfunction

我使用 Intel Compiler 进行编译,并在 Visual Studio 中逐步调试代码。mex 文件工作正常……

【讨论】:

嗨,亚当,您能就我的回答提供一些反馈吗?

以上是关于如何在matlab中创建m文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MAC OS MATLAB 读取在 windows MATLAB 中创建的 .mat 文件

如何在 MATLAB MEX 文件中创建双精度的 N-D 矩阵?

使用 Matlab codegen 在 Matlab 2013 中创建 mex 文件时出错

C++中CFile open函数怎么创建不了文件

在 Windows 上使用 GFortran 在 Matlab 中创建 Mex 文件

MATLAB中如何建立一个Mat文件