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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:34