[已解决] 循环语句错误-新手提问

[复制链接]
ybsmart2004 发表于 2015-6-9 12:10:02
各位大侠,请不吝指教,问题如下(32位,R2013A):

前面部分采用矩阵运算获得了所需的101×8矩阵,现在要做的是想将从左往右的顺序将后一列减去前一列,则得到7列差值的列向量,本想继续用矩阵加减来做,但仔细分析后发现对后续计算有影响,觉得还是采用循环语句来计算(从来没有学过编程,对这方面一点都不懂,是从用MATLAB后才慢慢有些了解,但不大会用),参考了HELP文件和自己的理解,进行了如下代码编写:

1. for n=1:8
       Kf(n)=RTPrd(:,n)
       Kf(n+1)=RTPrd(:,n+1)
       KfDiff(n+1) = Kf(n+1)-Kf(n)
   end


  结果出现提示信息:In an assignment  A(I) = B, the number of elements in B and I must be the same.我的理解是等号左边括号里的是一个元素,右边赋予的则是一个列向量,元素的数目不匹配。看来我理解错误,又研究了下HELP文件的信息,把代码又做了修改,如下:

2. for n=1:8
       KfPrev = RTPrd(:,n)
       KfLatter = RTPrd(:,n+1)
       KfDiff = KfLatter-KfPrev
   end


  这一次代码是可以运行的,计算的结果却是有8次,但结果跟我想象的不一样,每次的KfDiff都把上一次的运算差值给覆盖了,在最终内存里只有一列差值(101×1),没有7列数值,而且最后还弹出提示信息:

Attempted to access RTPrd(:,9); index out of bounds because size(RTPrd)=[101,8].

我理解为:索引号超过边界了,所以无法进入下一个运算,但我在最初已经定义了n=1:8这个范围,怎么还有这提示呢,同时怎么能够将每个列向量和最终得到的7列差值向量用不同的标记给保存下来,方便在后续运算中进行引用或合并计算,先谢过各位了!

最佳答案


stellari 发表于 2015-6-9 14:32:50
你可以这样想:

首先,循环的范围是n=1:8,总共进行了8次减法。但是我们最后希望的结果是7列,也就是本来应该用7次减法。所以,你可以简单地把n = 1:8改成 n = 1:7,就可以避免”out of bound”错误。

其次,每次循环得到的KfDiff会被下一次的结果冲掉,所以我们需要把这个结果存在一个更大的数组的某一列中。所以你可以用:
KfDiff(:, i) = KfLatter-KfPrev;

事实上,常用MATLAB的人更喜欢使用:

KfDiff = diff(RTPrd, 1, 2);
%Derivative of RTPrd of 1st order in 2nd dimension (columnwise)

这一句话解决问题。完全不需要循环。

--------

你的提问方式非常好。问题描述清晰,排版及颜色使用非常得体。我很高兴能看到有能够采取这样提问方式的人。若还有问题,请随时提问。

6 条回复


zype1128 发表于 2015-6-9 13:42:23
1. 你的Kf是什么,按代码里看,是个一维向量,那Kf(n)就是一个数了,把右边的向量赋给一个数,肯定会出错。
右边都(:,n),左边为啥是(n)?
2. n=8的时候,n+1=9。减法最多做7次,为啥要定义8?
报的出错信息那么明显,不知道去调试一下RTPrd(:,n+1)这玩意是否存在?

ybsmart2004 发表于 2015-6-9 14:06:40
说真心话,我对编程这块一点都不懂,也不是太敏感,尤其是这种循环语句,上学那会儿学了C语言,模糊记得变量、指针啥的概念,再往深了方面就一点都不懂了,所以在论坛里求助,还希望能够得到帮助。

stellari 发表于 2015-6-9 14:32:50
你可以这样想:

首先,循环的范围是n=1:8,总共进行了8次减法。但是我们最后希望的结果是7列,也就是本来应该用7次减法。所以,你可以简单地把n = 1:8改成 n = 1:7,就可以避免”out of bound”错误。

其次,每次循环得到的KfDiff会被下一次的结果冲掉,所以我们需要把这个结果存在一个更大的数组的某一列中。所以你可以用:
KfDiff(:, i) = KfLatter-KfPrev;

事实上,常用MATLAB的人更喜欢使用:

KfDiff = diff(RTPrd, 1, 2);
%Derivative of RTPrd of 1st order in 2nd dimension (columnwise)

这一句话解决问题。完全不需要循环。

--------

你的提问方式非常好。问题描述清晰,排版及颜色使用非常得体。我很高兴能看到有能够采取这样提问方式的人。若还有问题,请随时提问。
回复此楼

ybsmart2004 发表于 2015-6-9 17:42:40
Stellari,非常感谢您的指点:)

因为不是学计算机的,对程序语言一点都不懂,所以会出很大的笑话。由于工作中会处理大量的数据,以前一直都是在EXCEL表中做的(可惜的是VBA也没有学好,经常闹笑话),也四处找方便的工具,经同事的介绍知道了MATLAB软件,从资料和网站上及其他文献上知道MATLAB的广泛应用,于是从零开始学起的,也就零星时间中学习一点,算慢慢积累吧。去年5月份你在北京邮电学院参加过一次培训,了解MATLAB的基础使用,听当时的培训老师介绍说这个软件的熟练运用要有良好的线性代数基础(软件的帮助信息也说到它是基于矩阵运算的数值处理软件,好在英语还过得去,不然帮助文件可能都看不懂),在网上找了本线性代数的基础教程在看,一边看书学基础一边在软件中进行练习,自我感觉进步不少,现在在工作中遇到数值处理的问题,第一个反应就是考虑怎么利用矩阵的运算来做,搁以前用EXCEL处理的话,肯定是想用循环语句了。但是因为学习这个软件的时间也就尽量抽空来学的,所以到现在对它了解也不是很深,就像这次如果不是你指点用它的内置函数,我可能就卡在这个循环这里了;P,希望今后得到你们这些高手们的指导,再次表示感谢!

stellari 发表于 2015-6-9 18:28:03
ybsmart2004 发表于 2015-6-9 17:42
Stellari,非常感谢您的指点

因为不是学计算机的,对程序语言一点都不懂,所以会出很大的笑话。由于工作 ...

我觉得培训老师其实说得不是特别准确。应该是:只有当你需要用MATLAB来解决线性代数的问题时,你才需要良好的线性代数基础。比如,如何求特征值,如何求逆,如何进行奇异值分解等等。你说你之前用excel来处理数据,那么我推测你进行的运算应该是“表格式”的运算。比如排序,求和/差,选出符合指定条件的元素等等。这些其实和线性代数关系不大。比如你现在问的这个问题就是这样。

个人建议,如果你的日常工作中不涉及求逆,求秩,求特征值,求SVD等等,你基本上可以把线性代数的书放到一边了。更重要的是掌握一些常用的内置函数(比如这里的diff)。如果不知道希望做的事是否有内置函数能做到的话,请随时在论坛上提问。会有很多人帮助你的。

ybsmart2004 发表于 2015-6-10 11:19:54
stellari 发表于 2015-6-9 18:28
我觉得培训老师其实说得不是特别准确。应该是:只有当你需要用MATLAB来解决线性代数的问题时,你才需要良 ...

Stellari, 非常感谢您的回复。

我用MATLAB主要是处理实验的最优化条件,即在事先设计好的条件下得到部分实验数据(但此时不一定是最好的条件),通过实验数据进行分析(多用线性回归分析模型)来找到最佳条件,在这个过程中我得出了体会就是:用MATLAB做我的工作中时,时间快,效率高,目前用得多的操作就是矩阵乘法和求逆矩阵这两个了,之前在EXCEL表里做的话就特别慢,用你的话说就是挨个挨个做单元格操作,有时候还容易出错,也试着用VBA来提高效率,但实在是不懂程序,也出错,后来就放弃了。从刚开始知道MATLAB到现在能够按照自己的思路使用它有五年时间了,中间就断断续续的在使用,也顺带补充基础理论知识,现在有时候遇到相关的问题,去审视或想办法解决时,觉得自己的思路跟之前都不同了,就觉得这个软件真的很强大,除了解决实际工作中的问题,还能学习英语和数学,也提升了自己的思考问题的能力。希望今后在论坛里能得到你们这样的大侠帮助,再次感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表