八度误差:下标索引必须是正整数或逻辑

时间:2013-03-08 22:30:04

标签: matlab sum sequence octave indices

我试图将索引向量和索引矩阵的乘积相加:

k=[0:1:N-1]  
n=[0:1:N-1]  
x_n = sin(pi*n)  
N = size(x_n,2)  
_seqgen(x_n(n)*exp(k*n/N), n, 0..N-1)  

但是我收到了错误:

error: subscript indices must be either positive integers or logicals  

我在这里缺少什么?

编辑:我刚刚意识到我错过了_plus函数来对生成的序列求和。它应该是这样的:

k=[0:1:N-1]  
n=[0:1:N-1]  
x_n = sin(pi*n)  
N = size(x_n,2)  
_plus(_seqgen(x_n(n)*exp(k*n/N), n, 0..N-1))  

我仍然得到同样的错误......

2 个答案:

答案 0 :(得分:7)

错误消息解释了什么错误:您正在尝试使用不是正整数或逻辑的数字索引数组。代码中唯一的数组索引是x_n(n)。确实,行n=[0:1:N-1]表明索引n不是正数,因为0不是正数。课程: MATLAB / Octave始终从1开始索引。我建议你学习一些教程,因为这是你需要知道的基本内容。

答案 1 :(得分:2)

请允许我对您的代码提出一些批评 - 因为您承认您是新手。首先创建向量

n = [0:1:N-1];

顺便提一下,这不需要方括号,可以写成

n = 0:N-1;

然后生成一个向量x_n,对于给定的值,它将全为零(sin(pi*n) == 0表示n的整数值。

接下来,你做了一些奇怪的事情 - 你似乎正在生成一个符号序列,循环变量n,它看起来很像你之前定义的数组n。不知道该怎么做 - 看起来不是一个好主意。请注意,即使@jazzbassrob对此感到困惑 - 事实上你有一个“无法索引为零”的错误并不是因为你的向量n的值,而是因为你是从{{1在_seqgen命令中(不一样,尽管它恰好是相同的值)。

在_seqgen表达式中,我看到0..N-1有效,因为在此上下文中exp(k*n/N)是逐步通过n的变量 - 如果Matlab正在查看{{1的早期定义由于尺寸不匹配,它会抛出另一个错误(因为0..N-1是矩阵乘法运算符,并且期望第一个元素的第二个维度=第二个元素的第一个维度。)

执行您要执行的操作的更标准方法是

n

这是x_n中的术语与*mySum = sum(x_n.*exp(k.*n/N)); 的逐个元素乘积exp除以{{1}的逐个元素的乘法运算。 }。

注意 - 这实际上是否“更好”取决于你想对结果做什么(上面评估它)。