第1个回答 2017-11-28
扩展案例4,找到图中距离最近的一对端点:
第i行第j列表示城市i和城市j的距离,x[i,j]=x[j,i]
矩阵式对称的,且我们的目标使找到非0的最小值,并返回其所有的位置。
既然是对称的,只需要计算上三角(此例用上三角)或下三角的每一行的最小值,再找到这些最小值的那一个。
q<-matrix(c(0,12,13,8,20,12,0,15,28,88,13,15,0,6,9,8,28,6,0,33,20,88,9,33,0),
nrow=5,ncol=5)
mind<-function(d){
n<-nrow(d)
dd<-cbind(d,1:n)#为原矩阵增加一列,为相应的行号
wins<-apply(dd[-n,],1,imin)#dd[-n,],因为无需计算最后一行的最小值,上三角中值为0
i<-which.min(wins[2,])
#wins第1行为每行上三角最小值的列号,第2行为每行上三角的最小值
#在wins矩阵第2列找出最小值的位置,即为该最小值在原矩阵中的行号
j<-wins[1,i]
#j为wins矩阵中最小的值对应的k
#j为原矩阵的列号
return(c(d[i,j],i,j))
}
imin<-function(x){
lx<-length(x)
i<-x[lx]#注意此处返回的是行号,每一行的最后一个数字为对应的行号
j<-which.min(x[(i+1):(lx-1)])
#lx-1是为了不将行号值纳入计算,(i+1):(lx-1)为对应行i的上三角位置
#j取了该行上三角中最小值的位置
#举例,q第一行(i=1)的上三角值为12,13,8,20.那么最小值为8,j=3,k=i+j=4,为原矩阵中该行最小值的实际位置
k<-i+j
return(c(k,x[k]))
}
#imin主要应用在apply中,要考虑到其应用的是一个什么样子的矩阵
mind(q)
#[1] 6 3 4,最小的值是6,位于第3行第4列