- 积分
- 5
- 注册时间
- 2008-3-7
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2013-5-27 08:16:11
|
显示全部楼层
来自 台湾
本帖最后由 ChaChing 于 2013-5-27 08:50 编辑
可能原来没说清楚造成马兄弟误会, 真有些过意不去! 本想若LZ没回应(个人预期会如此), 就省事懒得说了, 反正干卿何事!
现在好像不说清楚还真不行了! 的确真的有些"力不从心"了, 眼睛花的厉害, 打字真有些吃力!(都150%!) 真是自作自受! 应该乖乖当我的看倌好好的学习便是, 何况没什麼硬实力, 该要学的还真多
为何说还存在问题? 或许仅是个人看法而已, 或许过於吹毛求疵!
再次重申不是指高手们没帮LZ解决问题!
长期来我好像看到一个现象, 许多人只要有程序可通了, 就不管原来自编的程序错在哪裡的!? 别忘记那是高手给的程序, 当然精湛可执行!
但个人以为, 清楚了解自编的程序错在那裡才是最基本的! 毕竟下次编程还是得自己来, 除非根本无此準备或心态! 若不关心自编的程序错在那裡, 那些错误不就一直存在吗? 敢问下如此真的会踏实吗? 对自己编程功力会真的有进步吗?
当然若能直接学习到高人的方式, 也不是不可, 只不过并非每个人都可以达到如此境界
所以个人一直以为若能知道原来错在哪裡, 才是真正解决问题! 当然我指的问题不仅是一般表面上的!
总之我要强调的重点, 不在有无实力或程度去学会那精湛的程序(这因人而异,改变有限), 而是在於有无那排误的学习态度! 个人感官迟钝, 还真没能察觉有存在这些态度!?
个人不才,不知有无交代清楚!? (做错事录口供~^~)
以下便是本来要po的东东, 本想算了(没营养又顾人怨!), 但还是…,恳请LZ与看倌包涵了
针对LZ的程序, 其中隐藏了不少问题! 就说说个人自以为是真正解决问题的过程或方式吧
1.建议养成好习惯,多看下Workspace及Help中的资讯
a)若看下Workspace, 就会发现ang是240*2,me是240*1!
b)如此plot(ang,me)其实是画了两条线! 等同plot(ang(:,1),me); hold on; plot(ang(:,2),me); 只不过第二条线几乎与y轴重合了! 可以修改那两个绘图指令成plot(ang,me,'o'); plot(ang,st,'o');便会很容易发现
c)追究ang为何是240*2, 不难发现是ang=[m,1]的错用! 我想LZ是要Preallocation,那就应该是ang=zeros([m,1]);吧!
2.建议多点开变数内容(使用双击)看看!
a)若看过x变数, 不难发现要画的x轴并非单调增加! (或者使用issorted检查)
b)如此是LZ要的吗? 若不是, 是否需考虑下先排序下或不画线!? 排序请help下sort或sortrows, 不画线类似上头检查图形的用法
3.建议养成好习惯,使用函数前先查下help并小试一下
a)若看过asin/acos的help, 不难发现asin/acos的输出范围分别是-pi/2~pi/2及0~pi, 那就需小心使用於各个象限
b)从先排序或不画线下的图形, 不难发现原写法產生非单值对应, 若LZ确认输入为一对一, 那就一定是用错了函数(可别如同某些人竟怀疑matlab函数)
c)要用对函数, 数学底子强的人或许直接即可应用正确, 但若如同个人水平一般的, 也可使用asind(1/2), acosd(1/2),asind(-1/2),acosd(-1/2)检验下, 不是吗
d)原来的逻辑判断未考虑出现零的情况, 很幸运LZ的原始座标点并无此状况
e)建议儘可能採用同一函数判断, 一下asin一下acos, 不是把问题复杂化, 个人以为一般人愈简化愈不会出错
f)另因为asin或acos的范围未含盖全域, 使得必须考虑较多, 若能多花些时间搜下help, 应该可以发现atan2或许更适用, 当然cart2pol及angle应该也可以
4.明明是一维的变数, 干嘛要使用二维的表示方式! 这样程序看起来很复杂, 一复杂化应该就容易出错吧!
5.xlabel('\it\theta^\o')
这些都是不难的错误(因为连老头都查到了), 相信LZ仔细点也可以自我发现! 只不过LZ好像浪费了一次自我排误的经验! 窃以为自我排误经验愈多, 编程能力自然提昇!- clear; clc;
- load z02ms.dat; x=z02ms(:,1); y=z02ms(:,2); me=z02ms(:,3); st=z02ms(:,4);
- [m,n]=size(z02ms); r=abs(sqrt(x.^2+y.^2)); ang=zeros(m,1);
- for i=1:m, temp=asind(y(i)/r(i)); acs=acosd(y(i)/r(i));
- if x(i)>=0 && y(i)>=0, ang(i)=temp;
- elseif x(i)<0 && y(i)>=0, ang(i)=90+acs; % ang(i)=180-temp;
- elseif x(i)<=0 && y(i)<0, ang(i)=180-temp;
- else ang(i)=450-acs; % ang(i)=360+temp;
- end
- end
- %% ang=atan2(y,x)*180/pi; ii=ang<0; ang(ii)=ang(ii)+360; %3~10行可更改成这一行
- [ang,indx]=sortrows(ang); me=me(indx); st=st(indx);
- subplot 211, plot(ang,me); grid on
- xlabel('\it\theta^\o');ylabel('mean pressure'); title('mean pressure ');
- subplot 212, plot(ang,st); grid on
- xlabel('\it\theta^\o');ylabel('Fluctuating pressure'); title('Fluctuating pressure rms');
复制代码 |
评分
-
2
查看全部评分
-
|