Scilab中按第一列相同值对第二列求和:替代循环及类似accumarray方法
问题:Scilab中实现矩阵分组求和的简便方法
需求:对矩阵第一列相同值对应的第二列数据求和。
给定矩阵:
c = [11 1; 11 3; 12 5; 13 9; 13 11; 13 3]
预期结果:
r = [11 4; 12 5; 13 23]
已知可通过循环实现该需求,但希望找到更简便的方法。在Matlab中可使用accumarray函数实现,请问Scilab中是否有类似功能的函数?
回答
Scilab里有几种简便方法可以实现这个按第一列分组对第二列求和的需求,以下是常用方案:
1. 利用unique+arrayfun+sum
先提取第一列的唯一值,再通过arrayfun批量计算每组对应的第二列求和:
[unique_vals, ~, group_idx] = unique(c(:, 1)); sum_vals = arrayfun(@(x) sum(c(group_idx == x, 2)), 1:length(unique_vals)); r = [unique_vals, sum_vals];
2. 排序后基于边界分组求和
先对矩阵按第一列排序,找到分组的边界位置后,批量计算每组的和:
[sorted_c, ~] = gsort(c, 1, 'i'); group_col = sorted_c(:, 1); value_col = sorted_c(:, 2); // 定位分组变化的边界 group_bounds = [1; find(diff(group_col) ~= 0) + 1; length(group_col) + 1]; // 计算每组的和 sum_vals = []; for i = 1:length(group_bounds)-1 sum_vals = [sum_vals; sum(value_col(group_bounds(i):group_bounds(i+1)-1))]; end r = [group_col(group_bounds(1:end-1)), sum_vals];
3. Scilab 2023.0及以上:直接使用accumarray
从Scilab 2023.0版本开始,官方已经引入了和Matlab用法一致的accumarray函数,这是最便捷的方案:
[unique_vals, ~, group_idx] = unique(c(:, 1)); sum_vals = accumarray(group_idx, c(:, 2)); r = [unique_vals, sum_vals];
运行上述任意一种方案,都能得到你预期的结果矩阵r。
内容的提问来源于stack exchange,提问作者JFS
相关产品推荐
相关产品推荐

