【问题标题】:R : Finding minimum value in a matrixR:在矩阵中找到最小值
【发布时间】:2020-11-29 03:41:31
【问题描述】:

我想对不同行的最小值进行迭代求和。

我有一个矩阵:

我想从第 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

【问题讨论】:

  • 循环何时停止?当它最终到达矩阵中的特定点时?到目前为止,您尝试过什么?

标签: r matrix sum


【解决方案1】:

假设您的矩阵 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

【讨论】:

    猜你喜欢
    • 2012-07-30
    • 2013-11-20
    • 2012-06-29
    • 2012-12-02
    • 2018-12-25
    • 2021-11-10
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    相关资源
    最近更新 更多