r - 推广任意大小矩阵的函数

标签 r matrix sapply

假设我有一些矩阵R

v1 <- c(1, .8, 0, .1, .2)
v2 <- c(.8, 1, .4, 0, .9)
v3 <- c(0, .4, 1, 0, 0)
v4 <- c(.1, 0, 0, 1, .5)
v5 <- c(.2, .9, 0, .5, 1)
R <- matrix(data=c(v1,v2,v3,v4,v5), nrow=5, byrow=TRUE)

我想使用最小-最大函数将值分配给不同的矩阵,R2:

R2 <- matrix(NA, nrow=5, ncol=5)
for(i in 1:nrow(R))
{
  for(j in 1:ncol(R))
  {
    R2[i,j] <- max(min(R[i,1],R[1,j]), min(R[i,2],R[2,j]), min(R[i,3],R[3,j]), min(R[i,4],R[4,j]), min(R[i,5],R[5,j]))
  }
}

这工作正常,但当矩阵大小发生​​变化时,我必须修改R2分配。如何将最小-最大函数推广到任何大小的矩阵?例如,我想要一个像这样的函数调用:

# to work, nrow(M1) == ncol(M2)
map_relation <- function(M1, M2)
{
  result <- matrix(NA, nrow=nrow(M1), ncol=ncol(M2))
  for(i in 1:nrow(M1))
  {
    max_val <- 0
    for(j in 1:ncol(M2))
    {
      # HOW CAN i MODIFY THIS TO APPLY GENERALLY TO ANY SIZED MATRIX?
      result[i,j] <- max(min(M1[i,1],M2[1,j]), min(M1[i,2],M2[2,j]), min(M1[i,3],M2[3,j]), min(M1[i,4],M2[4,j]), min(M1[i,5],M2[5,j]))
    }
  }
  return(result)
}

最佳答案

看来你有一个对称矩阵。任何人执行此操作的一种方法是:

R3 <-  matrix(NA, nrow=5, ncol=5)
for(i in 1:nrow(R)) {
  for(j in 1:ncol(R)){
     R3[i,j] <- max(pmin(R[i, ],R[,j]))
   } 
} 

您还可以使用apply。由于矩阵是对称的,因此您可以使用 MARGIN = 2MARGIN = 1

R4 <- apply(R, 2, \(x)apply(R, 1, \(y) max(pmin(x,y))))

all.equal(R3, R2)
[1] TRUE

关于r - 推广任意大小矩阵的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76915672/

相关文章:

r - 如何在列表列上应用一个函数并在 dplyr 和 purrr 中返回另一个函数?

r - 在两个不同长度的向量上应用函数,并在 R 中返回一个矩阵

r - 将几个月的零需求添加到动物园时间序列

python - 转换为适当的距离矩阵(对于 TSP)

r - 表示多个组的多个列

r - 根据特定模式按行分割数据帧

c++ - 使用数组与 vector 制作矩阵有哪些优缺点?

在 C 中创建一个基本矩阵(由用户输入!)

r - 将多参数函数应用于向量,仅改变一个参数

julia - 使用此向量的每个元素对向量的每个元素执行计算的简单方法