声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 8340|回复: 18

[编程技巧] 怎样把几个函数放在同一个M文件中?

[复制链接]
发表于 2007-10-13 00:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
在浏览帖子时,知道了MATLAB中可以把几个函数放到同一个M文件中,
可是不知道到底该怎么操作,请教大家了,谢谢
回复
分享到:

使用道具 举报

发表于 2007-10-13 09:17 | 显示全部楼层
function fun
........
function fun1
.........
function fun2
........
照此写下去就可以了。这个问题一般书上都有,版面以前也有过不少谈论。
发表于 2007-10-13 16:28 | 显示全部楼层

回复 #2 花如月 的帖子

想请问一下花版主
如果一个主函数需要调用多个其他函数
能否把这些函数写在一个M文件中?
发表于 2007-10-13 16:32 | 显示全部楼层

回复 #3 lxq 的帖子

前辈好客气,我觉得可以。为了方便我把本版一个xls读写的例子做了修改。不知道是不是你想要的调用方式?
  1. function xlswt
  2. %%%%%%%%开始读取原始数据
  3. clear,clc;
  4. filename='d:\lb025.xls';%滤波后数据存储的文件名,不要更改.xls后缀
  5. filename2='d:\025.xls';%将要滤波的文件路径\\不要更改
  6. sheet='4';%读取excel文档名称为4的表单
  7. t=xlsread(filename2,sheet,'a10:a56');%读取a10到a56的数据,可以根据实际情况更改以满足实际需要
  8. y1=xlsread(filename2,sheet,'f10:f56');
  9. t1=0.05:0.05:23.5;%路基宽度根据实际情况更改
  10. t1=t1';
  11. y11=resample(y1,10,1);%按10:1重新采样使曲线更平滑
  12. a1=denoise(y11,5,'db8');%a=denoise(s,lev,INH) s为待滤波信号,lev是分解层数,一般取3~7,INH为滤波小波基可采用db2~db10,sym2~sym8,coif1~coif5,dmey等等
  13. xlswrite(filename,t1,'a1:a470');
  14. xlswrite(filename,a1,'b1:b470');
  15. figure(1);
  16. subplot(3,1,1);plot(t,y1);
  17. title('原始数据曲线');
  18. xlabel('观测点位置(m)');
  19. ylabel('沉降量s(mm)');
  20. grid
  21. subplot(3,1,2);plot(t1,y11);
  22. title('重采样数据曲线');
  23. xlabel('观测点位置(m)');
  24. ylabel('沉降量s(mm)');
  25. grid
  26. subplot(3,1,3);plot(t1,a1);
  27. title('滤波数据曲线');
  28. xlabel('观测点位置(m)');
  29. ylabel('沉降量s(mm)');
  30. grid
  31. y2=xlsread(filename2,sheet,'j10:j56');
  32. y21=resample(y2,10,1);
  33. a2=denoise(y21,5,'db8');
  34. xlswrite(filename,a2,'c1:c470');
  35. figure(2);
  36. subplot(3,1,1);plot(t,y2);
  37. title('原始数据曲线');
  38. xlabel('观测点位置(m)');
  39. ylabel('沉降量s(mm)');
  40. grid
  41. subplot(3,1,2);plot(t1,y21);
  42. title('重采样数据曲线');
  43. xlabel('观测点位置(m)');
  44. ylabel('沉降量s(mm)');
  45. grid
  46. subplot(3,1,3);plot(t1,a2);
  47. title('滤波数据曲线');
  48. xlabel('观测点位置(m)');
  49. ylabel('沉降量s(mm)');
  50. grid
  51. y3=xlsread(filename2,sheet,'n10:n56');
  52. y31=resample(y3,10,1);
  53. a3=denoise(y31,5,'dmey');
  54. xlswrite(filename,a3,'d1:d470');
  55. figure(3);
  56. subplot(3,1,1);plot(t,y3);
  57. title('原始数据曲线');
  58. xlabel('观测点位置(m)');
  59. ylabel('沉降量s(mm)');
  60. grid
  61. subplot(3,1,2);plot(t1,y31);
  62. title('重采样数据曲线');
  63. xlabel('观测点位置(m)');
  64. ylabel('沉降量s(mm)');
  65. grid
  66. subplot(3,1,3);plot(t1,a3);
  67. title('滤波数据曲线');
  68. xlabel('观测点位置(m)');
  69. ylabel('沉降量s(mm)');
  70. grid
  71. %%%提取滤波后原始观测位置对应的数据
  72. lbt=xlsread(filename,'sheet1','a1:a470');
  73. lbt1=lbt(10:10:end);
  74. lby1=xlsread(filename,'sheet1','b1:b470');
  75. lby11=lby1(10:10:end);
  76. lby2=xlsread(filename,'sheet1','c1:c470');
  77. lby21=lby2(10:10:end);
  78. lby3=xlsread(filename,'sheet1','d1:d470');
  79. lby31=lby3(10:10:end);
  80. xlswrite(filename,lbt1,'f1:f47');
  81. xlswrite(filename,lby11,'g1:g47');
  82. xlswrite(filename,lby21,'h1:h47');
  83. xlswrite(filename,lby31,'i1:i47');
  84. %---------denoise.m-------实现小波去噪
  85. function a=denoise(s,lev,INH)
  86. [c,l]=wavedec(s,lev,INH);
  87. a=wrcoef('a',c,l,INH,lev);
  88. %----需要的子函数还可以继续写----
复制代码
这样实际上是把主函数和字函数写到一个m文件里,存为xlswt.m。调试的时候个人觉得方便些,用run或者在命令行直接输入xlswt
我用的一般就下边2种方式:
(1)把主程序和子程序都写到一个m文件里(和汇编语言有些类似),适合文件不太长的情形。上边的就是一个例子
(2)主程序写的一个文件里,被调用的子函数写到一起。
不知道其他版友都是怎么做的?欢迎分享啊
原始帖子位置:http://forum.vibunion.com/thread-52855-1-1.html(包含025.xls文件)

[ 本帖最后由 花如月 于 2007-10-13 16:44 编辑 ]

评分

1

查看全部评分

发表于 2007-10-13 16:42 | 显示全部楼层

回复 #4 花如月 的帖子

谢谢了
花版主的MATLAB学识着实让人钦佩
发表于 2007-10-13 16:49 | 显示全部楼层

回复 #5 lxq 的帖子

:loveliness:  客气了,要学习的地方还很多呢。
发表于 2007-10-13 17:09 | 显示全部楼层

花版主确实不错 写的诗词也很好
很早的时候 偶就注意了
第一次看到花如月这个名字还以为是个mm
:loveliness:
发表于 2007-10-13 17:15 | 显示全部楼层

回复 #7 jimin 的帖子

多谢前辈赞誉:handshake ,知道你比较忙。空了的时候多回来看看,看你贡献给神经网络初学者的资料。写的真是很棒,受益匪浅!
 楼主| 发表于 2007-10-13 18:33 | 显示全部楼层
谢谢,花版主和lxq两位高手的讨论,让我收获颇丰
发表于 2007-10-14 16:20 | 显示全部楼层
几个函数写在一个文件中,外界只能调用第一个函数。
如果真是想调用非第一个函数,那么必须通过第一个函数来管理。这比较麻烦

[ 本帖最后由 VibrationMaster 于 2007-10-14 16:22 编辑 ]

评分

1

查看全部评分

发表于 2007-10-14 16:32 | 显示全部楼层

回复 #11 VibrationMaster 的帖子

确实如此,这种方法也只是对于比较小的程序。把主程序作为第一个函数,其他的被调用的函数续写到后边。看起来是一个主程序和子程序都写到了一个m文件里了,貌似方便了一点点:loveliness:
发表于 2007-10-14 17:11 | 显示全部楼层
以 m 文件命名的函数:相当于 main 函数

写在同一个 m 文件中:第一个函数相当于公有函数,其他函数相当于私有函数

写在不同 m 文件中:全部都相当于公有函数

评分

1

查看全部评分

发表于 2007-10-14 20:46 | 显示全部楼层
高手讨论就是不一样,长见识了!
发表于 2009-3-26 11:16 | 显示全部楼层
受益匪浅。太感谢啦!!
发表于 2009-5-19 16:13 | 显示全部楼层

初来咋到

好幸运找到了这个论坛,以后请大家多多指教
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-21 08:09 , Processed in 0.063727 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表