如何查找矩阵列表中各对应位置的最小值
解决矩阵列表对应位置取最小值的问题
嘿,我来帮你搞定这个需求!你想要从两个矩阵的对应位置元素中取最小值生成新矩阵对吧?先帮你修正原始代码里的两处小问题:一是缺少矩阵x和z的初始化,二是列表d的定义有误(把向量k放进去了,应该换成矩阵z)。
先补全并修正你的原始代码
# 初始化5x5的0矩阵x x <- matrix(0, 5, 5) y <- c(3,2,4,5,6, 4,5,5,6,7) x[lower.tri(x, diag=F)] <- y x # 初始化5x5的0矩阵z z <- matrix(0, 5, 5) k <- c(1,4,5,2,5,-4,4,4,4,5) z[lower.tri(z, diag=F)] <- k z # 修正列表定义:放入两个矩阵x和z d <- list(x, z)
方法1:用do.call() + pmin()(最简洁高效)
pmin()函数可以按元素对多个对象取最小值,配合do.call()能把列表里的所有矩阵作为参数传入,一行代码就能搞定:
# 生成对应位置取最小值的矩阵 dd <- do.call(pmin, d) # 查看结果 dd
运行后会得到你预期的输出:
[,1] [,2] [,3] [,4] [,5] [1,] 0 0 0 0 0 [2,] 1 0 0 0 0 [3,] 2 5 0 0 0 [4,] 4 -4 4 0 0 [5,] 2 4 4 5 0
方法2:手动遍历元素(适合理解原理)
如果你想手动实现这个逻辑,可以用双重循环逐个比较每个位置的元素:
# 初始化空矩阵 dd <- matrix(0, 5, 5) # 遍历每一行和每一列,取对应位置的最小值 for (i in 1:nrow(x)) { for (j in 1:ncol(x)) { dd[i,j] <- min(x[i,j], z[i,j]) } } # 查看结果 dd
这个方法和方法1的结果完全一致,只是代码更长,适合用来理解底层的元素比较逻辑。
小提示
如果你的矩阵列表里有3个及以上矩阵,这个方法依然适用——pmin()会自动对所有矩阵的对应元素取最小值,不需要修改代码哦!
内容的提问来源于stack exchange,提问作者Maryam
相关产品推荐
相关产品推荐

