下标索引必须是小于2 ^ 31的正整数?

时间:2016-07-18 11:56:20

标签: matlab octave

当我执行此功能时:

function generate(x)

  for k=1:257
  x= round(rand*9);
  vet = x*ones(1,16);
  i= round(rand*length(vet));
  val= round(rand*257);
  vet(i)=val
  vet= dec2hex (vet)
  endfor

endfunction

我发现这个错误,我不明白:

error: generate: subscript indices must be either positive integers less than 2^31 or logicals
error: called from
    generate at line 8 column 9

如果你能帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:3)

我使用MATLAB R2015a来复制行为。错误文本略有不同,但代码要点与octave

相同

round(something)可以生成0。当我运行你的代码时,它每隔一段时间就会遇到一个0并与

崩溃
Attempted to access vet(0); index must be a positive integer or logical.

因为0不是正整数,在其他索引为正整数的情况下也不合逻辑。要解决此问题,我建议将ii中的所有零更改为1:

for k=1:257
  x= round(rand*9);
  vet = x*ones(1,16);
  ii= round(rand*length(vet));
  ii(ii==0)=1;
  val= round(rand*257);
  vet(ii)=val;
  vet= dec2hex (vet);
end % endfor for octave

请注意,我将 i 更改为 ii i is a built-in function

另一种方法是不使用round,而是使用ceil。这样它总是四舍五入到正无穷大,即只使用正数时它永远不会达到0

for k=1:257
  x= round(rand*9);
  vet = x*ones(1,16);
  ii= ceil(rand*length(vet));
  val= round(rand*257);
  vet(ii)=val;
  vet= dec2hex (vet);
end % endfor for octave