如何在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 之间的链接是如何建立的。
我编写了一个简单的程序,它接收x
和y
的值,将它们相加并输出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 类型是否足够大?尝试将它们声明为mwPointer
s。此外,如果您直接使用 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 文件时出错