transport包unbalanced函数output="all"时报错,无法获取运输方案
非均衡运输方案获取报错问题解决
问题场景
需要计算两个质量分布间的非均衡运输成本(推土机距离),使用R的transport库时,unbalanced函数在output="dist"时正常返回结果,但output="all"时抛出维度错误。
示例代码
m1 <- matrix(c(1,0,0,0),nrow = 2,ncol = 2) m2 <- matrix(c(0,0,0,1),nrow = 2,ncol = 2) a <- transport::pgrid(m1) b <- transport::pgrid(m2) transport::unbalanced(a,b,output = "dist") transport::unbalanced(a,b,output = "all")
报错信息
Error in rowSums(temp[1:m, ]) :
'x' muss ein Array mit mindestens zwei Dimensionen sein
//英文翻译: 'x' has to be an array of at least two dimensions
错误含义解释
这个错误表示rowSums函数接收的参数不是至少二维的数组。你的输入场景里,m1的质量完全集中在单个网格点(仅1个源点),m2的质量也完全集中在单个网格点(仅1个汇点),当调用unbalanced(a,b,output="all")时,函数内部生成的临时运输矩阵temp在切片后变成了一维向量,而rowSums要求输入必须是二维及以上的数组,因此触发报错。
获取运输方案的解决方法
方法1:手动生成运输方案
由于场景中源点和汇点都只有一个,运输逻辑非常直接:
- 源点坐标:
a$coords→ (0.25, 0.25) - 汇点坐标:
b$coords→ (0.75, 0.75) - 运输量:取两个分布总质量的最小值(此处两者总质量均为1,运输量为1)
- 运输成本:与
output="dist"返回的0.7071068一致(即两点间欧氏距离√0.5)
可手动构造运输方案的数据框:
transport_plan <- data.frame( from = 1, to = 1, mass = 1, distance = sqrt(0.5) )
方法2:调整输入避免单点场景
如果需要让unbalanced函数正常返回output="all",可以给源或汇添加微小的质量扰动,避免单点集中的情况:
# 给m1的其他网格点添加极小质量 m1_adjusted <- matrix(c(0.999, 0.0003, 0.0003, 0.0004), nrow=2, ncol=2) # 给m2的其他网格点添加极小质量 m2_adjusted <- matrix(c(0.0004, 0.0003, 0.0003, 0.999), nrow=2, ncol=2) a_adjusted <- transport::pgrid(m1_adjusted) b_adjusted <- transport::pgrid(m2_adjusted) # 此时调用output="all"可正常返回 result <- transport::unbalanced(a_adjusted, b_adjusted, output = "all")
返回的result中,绝大多数质量会集中在原场景的核心运输路径上,符合实际需求。
内容的提问来源于stack exchange,提问作者Noskario
相关产品推荐
相关产品推荐

