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

删除A、B列重复且D列为RED的行时遇MATLAB索引错误求助

问题描述

需求:当表格中两行的A列和B列值完全相同时,删除其中D列为RED的行。

示例表格:

A        B        C     D
1    March-1st    2    RED
1    March-1st    3   GREEN
3    March-5th    8   GREEN
6    March-8th    4   GREEN 
2    April-3rd    5    RED
2    April-3rd    0   GREEN

需删除第1行和第5行——它们的A、B列与其他行重复,且D列为RED。

现有MATLAB代码:

[G,GID] = findgroups(T.A,T.B);
is_red = strcmp(T.D,"RED");
delete_row = false(size(T,1),1);
for ii = 1:numel(GID)
    idx = G == GID{ii};
    if nnz(idx) == 1
        continue
    end
    delete_row(idx & is_red) = true;
end
T(delete_row,:) = []

执行时出现错误:

Error using tabular/parenDelete
Row index exceeds table dimensions.
Error in Parser
T(delete_row,:) = []

错误原因

核心问题是idx = G == GID{ii}这行逻辑错误:

  • G是findgroups返回的数值型分组索引向量(例如示例中G为[1;1;2;3;4;4],每个数字代表对应行的组号)
  • GID{ii}是对应第ii组的(A,B)组合值(例如第一个元胞是[1, "March-1st"])
    将数值向量与包含字符串的数组做相等比较,会生成二维逻辑数组,而非标记每行是否属于当前组的一维逻辑向量。后续操作会导致delete_row的维度或索引范围异常,最终触发表格索引越界错误。
修复方案

将循环内的idx计算改为基于分组编号的匹配,即idx = G == ii,因为ii是从1到组数的循环变量,与G的数值组号一一对应。

修复后的代码:

[G,GID] = findgroups(T.A,T.B);
is_red = strcmp(T.D,"RED");
delete_row = false(size(T,1),1);
% 遍历每个分组编号(ii对应G中的组号)
for ii = 1:numel(GID)
    % 正确获取当前组的所有行索引
    idx = G == ii;
    % 如果组内只有一行,无需处理
    if nnz(idx) == 1
        continue
    end
    % 标记组内D列为RED的行
    delete_row(idx & is_red) = true;
end
% 删除标记的行
T(delete_row,:) = [];
验证结果

用示例表格测试修复后的代码:

  • 分组1(A=1,B=March-1st):标记第1行(D=RED)为待删除
  • 分组4(A=2,B=April-3rd):标记第5行(D=RED)为待删除
  • 其他分组只有单行,跳过处理
    最终表格会正确删除目标行,得到预期结果:
A        B        C     D
1    March-1st    3   GREEN
3    March-5th    8   GREEN
6    March-8th    4   GREEN 
2    April-3rd    0   GREEN

内容的提问来源于stack exchange,提问作者user23604607

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:02:51