【问题标题】:octave error: subscript indices must be either positive integers or logicals八度错误:下标索引必须是正整数或逻辑数
【发布时间】:2013-02-24 14:43:51
【问题描述】:

我正在尝试对索引向量和索引矩阵的乘积求和,如下所示:

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))  

但我仍然遇到同样的错误......

【问题讨论】:

  • 我忘了说我刚刚开始使用matlab/octave。我在网上搜索了不同的方法来做到这一点,但我只是难住了。

标签: matlab sum sequence octave indices


【解决方案1】:

错误消息解释了问题所在:您尝试使用非正整数或非逻辑数字索引数组。代码中唯一的数组索引是x_n(n)。果然,n=[0:1:N-1] 行表明索引n 不是正数,因为0 不是正数。课程:MATLAB/Octave 总是从 1 开始索引。我建议你真正学习一些教程,因为这是你需要了解的基础知识。

【讨论】:

  • 在用户@user2150186 的辩护中,该错误听起来好像索引表达式本身的类型(或类)存在根本性错误。考虑到问题是 one single 不正确的 value 用作下标,该消息过于笼统。 “零不是有效索引”会更好。
【解决方案2】:

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

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

顺便说一句,不需要方括号,可以写成

n = 0:N-1;

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

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

在那个 _seqgen 表达式中,我看到 exp(k*n/N) 有效,因为在这种情况下,n 是通过 0..N-1 逐步执行的变量 - 如果 Matlab 正在查看 n 的早期定义,它将引发另一个错误因为维度不匹配(因为* 是矩阵乘法运算符,并且期望第一个元素的第二个维度 = 第二个元素的第一个维度)。

一种更标准的方式来做你想做的事情是

mySum = sum(x_n.*exp(k.*n/N));

这会对 x_n 中的项和kn 的逐元素乘积除以Nexp 进行逐元素相乘。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2014-09-25
    • 2013-04-19
    • 2021-07-02
    • 2012-04-14
    • 2016-02-16
    相关资源
    最近更新 更多