Matlab索引超出范围

问题描述 投票:0回答:2

运行程序时,似乎出现索引超出范围错误。它似乎发生在第19行,与vec2变量有关。我不明白为什么会这样,因为vec2的初始化方式与vec相同。任何帮助,将不胜感激。谢谢!

N = 6;
vec2 = ones(1,N);
vec = ones(1,N) * -1;


for i = 1:N
  num = input('Enter an integer: ');

  if num >= 0
      vec(i) = num;
  else
      vec2(i) = num;
  end

  if sign(vec(i)) == -1
      vec(i) = [];
  end

  if sign(vec2(i)) == 1
      vec2(i) = [];
  end
end

save pos.dat vec -ascii;
save neg.dat vec2 -ascii;
arrays matlab runtime-error indexoutofboundsexception
2个回答
0
投票

我认为您正在执行此操作

  vec(i) = [];

和此

  vec2(i) = [];

在每次迭代之后,索引i都在增加,而vec或vec2在减少。因此,经过3次迭代,vec或vec2的长度变为零。所以顺便说一句,您正在尝试使用这些代码实现什么。

   if sign(vec(i)) == -1
    vec(i) = [];
   end

   if sign(vec2(i)) == 1
    vec2(i) = [];
   end

如果删除上面的代码,它将正常工作。最好知道您的目标是什么,以便提出替代解决方案。


0
投票

您正面临的问题可以说明如下:

vec = [1, 2, 3];% assuming a given vector vec, length = 3
vec(2) = 5; % no problem 
vec = [1, 5, 3];
vec(2) = [];% vec length is 2
vec = [1, 3];
vec(3) = 10; % not allowed 
%% index out of range since the length of vec is 2

替代

  • 而不是首先删除单元格
  • nan填充
  • 然后用nan删除所有单元格>
  • 代码如下

N = 6;
vec2 = ones(1,N);
vec = ones(1,N) * -1;


for i = 1:N
  num = input('Enter an integer: ');

  if num >= 0
      vec(i) = num;
  else
      vec2(i) = num;
  end

  if sign(vec(i)) == -1
      vec(i) = nan;
  end

  if sign(vec2(i)) == 1
      vec2(i) = nan;
  end
end
%% remove nan
vec = vec(~isnan(vec));
vec2 = vec2(~isnan(vec2));
© www.soinside.com 2019 - 2024. All rights reserved.