声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1458|回复: 7

[综合讨论] 函数调用问题

[复制链接]
发表于 2010-5-15 20:43 | 显示全部楼层 |阅读模式

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

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

x
我写了一个主函数
调用事先编写好的各个子函数(每个子函数都可正确算出结果)
但主函数中总是说Undefined function or variable 'my_EEP',为什么?肯定运行到后面几个子函数时也会出现同样问题
(之前编的程序用同样方法调用函数都可以,不知这次是为什么。排除没有函数目录的原因)
下附代码
  1. p = 0.02:0.02:0.2
  2. PSNR_EEP = my_EEP_scheme(p);
  3. PSNR_UEP_scheme1 = my_UEP_scheme1(p);
  4. PSNR_UEP_scheme2 = my_UEP_scheme2(p);
  5. PSNR_UEP_scheme3 = my_UEP_scheme3(p);
  6. PSNR_UEP = my_UEP_function(p);
  7. PSNR_UEP_paper = my_paper_mode(p);
复制代码
我之前写了一个函数,然后把其save下,在每个子函数都load下,会不会是跟这个有关系?
菜鸟向各位老师求救

[ 本帖最后由 sunbojun0130 于 2010-5-15 20:45 编辑 ]
回复
分享到:

使用道具 举报

发表于 2010-5-16 00:15 | 显示全部楼层
请参阅, 常见的程序出错问题整理 (eight), 3F
http://forum.vibunion.com/forum/thread-46001-1-1.html
并请使用which my_EEP -all检查下
还有LZ给的代码并没有"my_EEP"?

"在每个子函数都load下",  什么意思? :loveliness:

[ 本帖最后由 ChaChing 于 2010-5-16 11:06 编辑 ]
 楼主| 发表于 2010-5-16 18:42 | 显示全部楼层

回复 沙发 ChaChing 的帖子

问题一:说实话我之前真看过那篇文章,我明白,斑竹的意思是想说有一个关于函数调用的例子就是子函数中如果有输入变量在主函数中必须之前要给变量赋初值,但是在主函数中我确实已经赋过值了(p = 0.02:0.02:0.2),还有一种可能性就是.m文件所在文件夹没有在MATLAB的路径中,可是我在set path中早就已经添加了此文件夹,所以这个原因也排除了,然后我就不知道了
问题二:代码没有"my_EEP"是因为这个子函数能够正确计算出结果
问题三:“load下”因为我的每个子函数都是用同样的参数,没必要每个程序都写一遍,所以我先写了一个参数计算的m文件,然后保存下来(save mypara.mat),然后再每个子函数调用时再load mypara.mat

最后还是附上my_EEP_scheme函数吧
  1. %% EEP scheme %%
  2. function PSNR_EEP = my_EEP_scheme(p)
  3. clear all;
  4. clc;
  5. close all;
  6. load mypara.mat;
  7. % EEP FEC值
  8. x = [31,31,31;31,31,31;31,31,31;31,31,31;31,31,31]; % FEC保护长度
  9. h_eep = round(B./(N-31)); % 每个单元的高度
  10. my_fec_EEP = sum(sum(h_eep*31))
  11. sigma_h = sum(sum(h_eep))
  12. if sigma_h <= M

  13. % calculate parameter Pe
  14. % p is packet loss probability and equal to packet loss rate
  15. my_Pe = zeros(T,Q);
  16. for i=0:T-1
  17. for j=0:Q-1
  18. for q = 0:x(i+1,j+1)
  19. my_Pe(i+1,j+1) = my_Pe(i+1,j+1) + nchoosek(N,q)*(p^q)*((1-p)^(N-q));
  20. end;
  21. end;
  22. end;
  23. Dchannel_loss = D.*(1-my_Pe).*num;
  24. Dchannel_loss_sum = sum(sum(Dchannel_loss));
  25. my_Pe
  26. Dloss_EEP = D0*(1+Dchannel_loss_sum)
  27. Dloss_EEP_average = Dloss_EEP/31
  28. PSNR_EEP = 10*log10((255^2)/Dloss_EEP_average)
  29. else
  30. disp('sigma_h is larger than M');
  31. end;
  32. end
复制代码

[ 本帖最后由 sunbojun0130 于 2010-5-16 19:05 编辑 ]
发表于 2010-5-17 00:21 | 显示全部楼层

回复 板凳 sunbojun0130 的帖子

LZ在1F给的代码并没有出现"my_EEP"的变数或函数, 怎会出现Undefined function or variable 'my_EEP'??
到底my_EEP在何处? 是变数或函数? 若是函数还是使用which my_EEP -all检查下!

错误讯息与LZ给的相关程式无法对应!?:loveliness:
还有my_EEP_scheme函数写法真的很怪, 传进的p变数, 马上被clear all干嘛还需传进?:loveliness:
 楼主| 发表于 2010-5-17 08:55 | 显示全部楼层

回复 地板 ChaChing 的帖子

其实我也觉得很诡异
我明明写的函数是my_EEP_scheme,但是它却提示my_EEP
我用了下which my_EEP all啥东西都没有,我又试了试 which my_EEP_scheme all,结果给出文件具体位置(E:\毕设编程\Enumeration\my_EEP_scheme.m)
??? Undefined function or variable 'my_EEP'.
而且我还设了断点在主函数的p赋值那一行,然后点运行,应该还没到子函数,可是它却显示同样的报错信息,这是为什么
 楼主| 发表于 2010-5-18 19:08 | 显示全部楼层

我解决了

我解决了
我的主函数命名为my_EEP&UEP_comparison.m
实际上它指的没定义变量指的是函数名中的一部分
我就把函数内容粘到新建的m文件中保存为SVC_UEP.m就可以用了
可能是因为函数名和子函数中有相同的部分所以就出错了
最后附上本人修改后代码
  1. %% comparison
  2. clear all;
  3. clc;
  4. close all;
  5. PSNR_EEP = my_EEP_scheme;
  6. PSNR_UEP_paper = my_paper_mode;
  7. PSNR_UEP_scheme1 = my_UEP_scheme1;
  8. PSNR_UEP_scheme2 = my_UEP_scheme2;
  9. PSNR_UEP_scheme3 = my_UEP_scheme3;
  10. PSNR_UEP = my_UEP_function;
  11. legend('EEP','Paper mode','UEP scheme1','UEP scheme2','UEP scheme3','UEP fuction');
复制代码


最后感谢斑竹的帮忙

[ 本帖最后由 sunbojun0130 于 2010-5-18 19:11 编辑 ]

评分

1

查看全部评分

发表于 2010-5-18 19:50 | 显示全部楼层

回复 6楼 sunbojun0130 的帖子

喔LZ使用到matlab的保留字"&"! :loveliness:
其实之前有一想, 但最近工作实在忙, 忘了跟LZ提!
本猜测LZ是否档名与function后的取名不同!?
一开始若问及或告知档名, 或许就不会浪费LZ这些时间!
总之档名是不能使用到保留字的, 可惜这使用which是无法发觉其错误!
 楼主| 发表于 2010-5-18 20:54 | 显示全部楼层

回复 7楼 ChaChing 的帖子


这回知“所以然”了
多谢版主
有时编程是需要一些时间琢磨的,我想这些时间是有必要花的
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-29 10:29 , Processed in 0.058097 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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