You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:41:05