R语言:如何获取矩阵列表逐元素最小值的来源矩阵?
解决方案:追踪最小值对应的来源矩阵
针对你的需求,我们可以通过将矩阵列表转换为三维数组,再结合apply函数轻松定位每个最小值来自列表中的哪个矩阵,步骤清晰且高效:
步骤1:计算最小值矩阵
先用你已经熟悉的方式得到所有矩阵对应位置的最小值:
min_mat <- do.call(pmin, d)
步骤2:转换为三维数组并追踪来源
把矩阵列表转换成三维数组(每个矩阵对应数组的一个切片),然后对每个元素位置(行和列维度)使用which.min找到最小值所在的矩阵索引:
# 将列表转换为三维数组 arr <- simplify2array(d) # 对每个(row, col)位置,找到最小值对应的矩阵索引 source_mat <- apply(arr, c(1, 2), which.min)
验证结果
现在查看source_mat就能直观看到每个最小值的来源:
> source_mat [,1] [,2] [,3] [,4] [,5] [1,] 1 1 1 1 1 [2,] 1 1 1 1 1 [3,] 2 2 1 1 1 [4,] 1 1 1 1 1 [5,] 1 1 1 1 1
举几个例子验证:
- 第3行第1列的最小值是2,来自第二个矩阵(
d[[2]]也就是x),对应source_mat[3,1] = 2,和实际情况完全一致; - 第4行第2列的最小值是-4,来自第一个矩阵(
d[[1]]也就是z),对应source_mat[4,2] = 1,准确无误。
处理多矩阵最小值相同的情况
如果某个位置有多个矩阵的数值等于最小值,which.min会返回第一个出现的矩阵索引。如果你需要获取所有符合条件的矩阵索引,可以把which.min替换成自定义函数:
source_mat_all <- apply(arr, c(1, 2), function(x) which(x == min(x)))
这样每个位置会返回一个向量,包含所有提供最小值的矩阵索引。
内容的提问来源于stack exchange,提问作者user9798936
相关产品推荐
相关产品推荐

