首页 > 解决方案 > R:在矩阵中找到最小值

问题描述

我想迭代地总结不同行的最小值。

我有一个矩阵:

在此处输入图像描述

我想从第 1 行(选择的值不是 0)开始找到这个矩阵的最小值。然后迭代地选择在第 1 行中提供最小值的列。接下来,选择与先前选择的列相同的下一行编号,依此类推。最后,对总数求和。

例如,从第 1 行开始并选择第 4 列,因为它提供的最小值为 13.924。然后,移动到第 4 行并再次找到最小值,它可能是第 3 列的 46.789。然后,移动到第 3 行并在第 2 列中找到该行中的最小值为 71.950。然后,从第 2 行中选择第 5 列。

对于这个例子:

mat_test[1,4] + mat_test[4,3] + mat_test[3,2] + mat_test[2,1]

13.924 + 46.789 + 71.950 + 25.579

total sum = 158.242

标签: rmatrixsum

解决方案


假设您的矩阵mat_test始终是方阵,您可以尝试下面的代码来实现您的目标

mat_test <- `diag<-`(mat_test,Inf)
inds <- c()
row <- 1
while (!row %in% inds[,1]) {
  inds <- rbind(inds,c(row,rowNew <- which.min(mat_test[row,])))
  row <- rowNew
}
total <- sum(mat_test[inds])

例子

set.seed(1)
mat_test <- `diag<-`(matrix(rnorm(25),nrow = 5),0)

> mat_test
           [,1]       [,2]       [,3]        [,4]        [,5]
[1,]        Inf -0.8204684  1.5117812 -0.04493361  0.91897737
[2,]  0.1836433        Inf  0.3898432 -0.01619026  0.78213630
[3,] -0.8356286  0.7383247        Inf  0.94383621  0.07456498
[4,]  1.5952808  0.5757814 -2.2146999         Inf -1.98935170
[5,]  0.3295078 -0.3053884  1.1249309  0.59390132         Inf

然后

> inds
     [,1] [,2]
[1,]    1    2
[2,]    2    4
[3,]    4    3
[4,]    3    1

> mat_test[inds]
[1] -0.82046838 -0.01619026 -2.21469989 -0.83562861

推荐阅读