MATLAB中如何从三维多维数组中删除第二维度的指定列?
MATLAB三维数组第二维度指定索引删除方案
报错原因
MATLAB中对多维数组赋值[]删除元素时,必须保证除了要删除的维度之外,其余所有维度都使用冒号:做全量索引,不能指定部分索引。你原代码中data(ch, rejected_trials, :) = []第一维度仅指定了单个通道ch、未做全选,因此触发报错。
另外你原代码存在变量名冲突问题:循环变量trial和存储总试次数的变量trial同名,循环执行后会覆盖总试次数的原始值,导致逻辑错误。
方案1:统一删除所有通道的相同试次(保留三维数组结构,推荐)
三维数组的所有通道第二维度(试次)长度必须一致,因此通常建议先汇总所有需要删除的试次,对所有通道统一执行删除操作,代码示例如下:
channel = 32; total_trial = 75; % 替换原变量名,避免和循环变量冲突 time = 2000; data = MyCustomData(...); rejected_trials = []; % 遍历所有通道和试次,汇总所有需要删除的试次索引 for ch = 1:channel for t = 1:total_trial if is_rejected_trial(data(ch, t, :)) rejected_trials(end + 1) = t; end end end % 对要删除的试次索引去重 rejected_trials = unique(rejected_trials); % 全量索引剩余维度,直接删除第二维度对应试次 data(:, rejected_trials, :) = [];
执行后data的维度为 32 × (75 - length(rejected_trials)) × 2000,符合需求。
方案2:各通道独立删除不同试次(使用cell数组存储)
如果确实需要为不同通道删除不同数量的试次,无法保留统一三维数组结构,可改为用cell数组存储各通道的独立数据:
channel = 32; total_trial = 75; time = 2000; data = MyCustomData(...); data_cell = cell(channel, 1); for ch = 1:channel rejected_trials = []; for t = 1:total_trial if is_rejected_trial(data(ch, t, :)) rejected_trials(end + 1) = t; end end % 提取当前通道的二维数据,删除指定试次后存入cell ch_data = squeeze(data(ch, :, :)); ch_data(rejected_trials, :) = []; data_cell{ch} = ch_data; end
执行后data_cell中每个元素对应一个通道的处理后数据,试次长度可互不相同。
内容的提问来源于stack exchange,提问作者Minseok Song
相关产品推荐
相关产品推荐

