假设我有一个矩阵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相关问答推荐

如何判断R中一列的值是否在所有其他列中重复?

使用列表列作为case_when LHS的输入

如何将图案添加到ggplot中的一个类别

使用na.locf在长格式数据集中输入具有多个时间点的数据集

按块将载体转换为矩阵-reshape

根据固定值范围在tible中添加新行

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

使用ggplot将平滑线添加到条形图

为什么当我try 在收件箱中使用合并功能时会出现回收错误?

将年度数据插入月度数据

使用ggsankey调整Sankey图中单个 node 上的标签

如何在所有绘图中保持条件值的 colored颜色 相同?

为什么我的基准测试会随着样本量的增加而出现一些波动?

在数组索引上复制矩阵时出错

计算满足R中条件的连续列

如何在R中描绘#符号?

按多列统计频次

用多边形替换地块点

以任意顺序提取具有多个可能匹配项的组匹配项

整理ggmosaic图的标签