Octave过滤数据时出现index out of bounds错误是什么原因?
报错含义
index out of bounds: value 741 out of bound 740
该报错为索引越界错误:代码尝试访问矩阵的第741行,但此时矩阵实际仅存在740行,对应索引位置不存在,因此触发报错。
错误根源
你的代码存在两个核心逻辑问题:
- 循环开始前你预先将
m赋值为初始X的行数892,但循环过程中每满足一次条件就会删除X的一行,导致X的实际行数持续减少,当循环变量i超过X当前的总行数时,就会触发索引越界。 - 你删除
X的行之后,X的索引已经和原始train_set的索引不再一一对应,继续用train_set(i,7)作为判断条件,后续的筛选结果也会出现匹配错位。
解决方案
优先使用Octave原生的向量化逻辑索引实现,无需写循环,执行效率更高且不会出现索引错误:
train_set = csvread('train.csv'); X = [train_set(:,3),train_set(:,7)]; y = train_set(:,2); % 生成逻辑掩码:第二列不为0的行标记为true mask = X(:,2) ~= 0; % 同时过滤X和y的对应行,保证二者索引匹配 X = X(mask, :); y = y(mask, :);
如果你需要保留循环写法,可以将循环顺序改为从后往前遍历,删除末尾行不会影响前面行的索引,不会出现越界问题:
train_set = csvread('train.csv'); X = [train_set(:,3),train_set(:,7)]; y = train_set(:,2); m = size(X,1); % 倒序遍历 for i = m:-1:1 if X(i,2) == 0 X(i,:) = []; y(i,:) = []; % 同步删除y的对应行,避免后续索引不匹配 endif end
内容的提问来源于stack exchange,提问作者VIDHAN JAIN
相关产品推荐
相关产品推荐

