如何实现双重求和?使用outer()函数求解遇困境
解决双重求和问题:用
outer()正确计算单个总和结果 我来帮你搞定这个双重求和的问题~看起来你混淆了cumsum()和outer()的用法,咱们一步步理清楚:
你的需求拆解
你要计算的是双重求和:对i从1到10,j从1到5,所有项i^5/(10+j^i)的总和,最终得到一个单个数值结果。
你当前代码的问题
- 用
cumsum()是方向错了:cumsum()是对向量做累加运算,比如cumsum(c(1,2,3))会返回c(1,3,6),它不是用来计算所有i、j组合项的总和的。而且你写cumsum(i^5/(10+j^i))时,因为i和j长度不同,R会自动循环补齐j到10个元素,得到的结果是一个长度为10的数组,这完全不是你要的双重求和结果。 sum(outer(l))的用法也不对:outer()需要两个向量和一个二元函数来生成外积矩阵,你直接传l(cumsum的结果)进去,相当于计算l和l的外积,完全偏离了你的求和目标。
正确的解法:用outer()生成所有组合项再求和
outer()正是处理这种"对两个向量所有元素组合计算某函数"的场景,我们只需要给它传入i、j,以及计算单个项的函数,然后对生成的矩阵求和即可:
i <- 1:10 j <- 1:5 # 用outer生成10×5的矩阵,每个元素对应一组(i,j)的计算结果 sum_matrix <- outer(i, j, function(x, y) x^5 / (10 + y^x)) # 对矩阵所有元素求和,得到最终的单个结果 total_sum <- sum(sum_matrix) # 查看结果 total_sum
另一种等价方法:用expand.grid生成所有组合
如果你觉得outer()的函数参数写法有点绕,也可以用expand.grid生成所有i、j的组合,再逐行计算后求和:
i <- 1:10 j <- 1:5 # 生成所有i和j的组合 all_combinations <- expand.grid(i = i, j = j) # 计算每个组合的项并求和 total_sum <- sum(all_combinations$i^5 / (10 + all_combinations$j^all_combinations$i))
这两种方法得到的结果是完全一致的,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者likeliterallysoum
相关产品推荐
相关产品推荐

