MATLAB双循环迭代报错:索引超出数组元素数求助
问题分析与解决
错误根源
你的代码触发索引越界的原因很明确:
AVGRatings包含7个元素(最后一个是inf),但ratings只有6个评级标签- 当某球员的击球率≥0.340(
AVGRatings的第6个阈值)时,循环会走到j=7,此时调用ratings{j}就会超出ratings的元素数量(最多到索引6),直接触发报错。
修正方案
方案1:修复循环逻辑
调整内层循环的范围,只遍历ratings的长度,并兜底处理击球率≥0.340的情况:
ratings = {'Bad', 'Below Average', 'Average', 'Above average', 'Great', 'Elite'}; AVGRatings = [0.200, 0.220, 0.255, 0.280, 0.310, 0.340, inf]; for i = 1:height(Batting) fprintf('Player %d:\n', i); assigned = false; % 只循环到ratings的元素数量,避免越界 for j = 1:numel(ratings) fprintf(' Trying rating %d\n', j); if Batting.AVG(i) < AVGRatings(j) Batting.AVG_Rating{i} = ratings{j}; fprintf(' Assigned rating %s\n', ratings{j}); assigned = true; break; end end % 兜底处理:所有阈值都不满足时,分配最高评级Elite if ~assigned Batting.AVG_Rating{i} = ratings{end}; fprintf(' Assigned rating %s\n', ratings{end}); end end
方案2:用MATLAB内置函数简化(推荐)
使用discretize函数可以直接完成区间映射,无需手动写循环,效率更高且避免索引问题:
ratings = {'Bad', 'Below Average', 'Average', 'Above average', 'Great', 'Elite'}; % 定义区间边界:(-inf, 0.200), [0.200, 0.220), ..., [0.340, inf) edges = [-inf, 0.200, 0.220, 0.255, 0.280, 0.310, 0.340, inf]; % 获取每个击球率对应的评级索引 ratingIdx = discretize(Batting.AVG, edges); % 批量分配评级 Batting.AVG_Rating = ratings(ratingIdx);
内容的提问来源于stack exchange,提问作者H. Walker
相关产品推荐
相关产品推荐

