如何在Matlab中高效对嵌套Cell数组进行垂直求和
嵌套Cell数组列垂直求和的MATLAB优化方案
问题背景
给定嵌套Cell数组DB,需要对每一列的元素执行垂直求和操作。当前采用嵌套for循环实现,运行效率偏低,需优化以减少或消除循环。
原始数据
DB={ {[11 12]} {[13 14]} {[15 16]} {[17 18]} {[19 20]}; {[21 22]} {[23 24]} {[25 26]} {[27 28]} {[29 30]}; {[31 32]} {[33 34]} {[35 36]} {[37 38]} {[39 40]}}
期望结果
[33 36] [69 72] [75 78] [81 96] [87 90]
注:原期望结果中[81 44]为笔误,按数据计算应为17+27+37=81,18+28+38=96
现有循环实现
sum = []; for j=1:5 sumi = 0; for i=1:3 sumi = sumi + DB{i,j}{1}; % 原代码中c2应为DB,修正笔误 end sum = [sum sumi]; end
注意:sum是MATLAB关键字,建议改用result等变量名避免冲突
优化方案
方案1:完全无循环的向量化解法
利用cellfun展开嵌套结构,结合数组维度求和实现:
% 提取嵌套Cell中的向量,生成3×5的Cell矩阵 cell_mat = cellfun(@(x) x{1}, DB, 'UniformOutput', false); % 将Cell矩阵拼接为3×2×5的数值数组,沿第一维度求和后压缩维度 sum_values = squeeze(sum(cat(3, cell_mat{:}), 1)); % 转换为期望的Cell格式 result = num2cell(sum_values, 2);
此方案完全消除循环,借助MATLAB的向量化特性,处理大规模数据时效率提升显著。
方案2:单循环+矩阵操作优化
保留外层循环,用矩阵操作替代内层循环,代码更直观:
result = cell(1, size(DB,2)); for j=1:size(DB,2) % 将当前列的嵌套Cell转为矩阵,按行求和 col_matrix = cell2mat(DB(:,j)); result{j} = sum(col_matrix, 1); end
该方案仅保留一层循环,内层循环由高效的矩阵求和操作替代,性能优于嵌套循环。
内容的提问来源于stack exchange,提问作者jeanjacquesvivde
相关产品推荐
相关产品推荐

