You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言验证矩阵每行N个最大值提取结果是否符合预期

问题说明
  • 给定8×8矩阵P,结构定义如下:
P=structure(c(0, 0.000111068823678012, 0.000111068823678012, 2.67039921763476e-06, 
0.000111068823678012, 2.67039921763476e-06, 2.67039921763476e-06, 
1.52848625094731e-07, 0.000111068823678012, 0, 2.67039921763476e-06, 
0.000111068823678012, 2.67039921763476e-06, 0.000111068823678012, 
1.52848625094731e-07, 2.67039921763476e-06, 0.000111068823678012, 
2.67039921763476e-06, 0, 0.000111068823678012, 2.67039921763476e-06, 
1.52848625094731e-07, 0.000111068823678012, 2.67039921763476e-06, 
2.67039921763476e-06, 0.000111068823678012, 0.000111068823678012, 
0, 1.52848625094731e-07, 2.67039921763476e-06, 2.67039921763476e-06, 
0.000111068823678012, 0.000111068823678012, 2.67039921763476e-06, 
2.67039921763476e-06, 1.52848625094731e-07, 0, 0.000111068823678012, 
0.000111068823678012, 2.67039921763476e-06, 2.67039921763476e-06, 
0.000111068823678012, 1.52848625094731e-07, 2.67039921763476e-06, 
0.000111068823678012, 0, 2.67039921763476e-06, 0.000111068823678012, 
2.67039921763476e-06, 1.52848625094731e-07, 0.000111068823678012, 
2.67039921763476e-06, 0.000111068823678012, 2.67039921763476e-06, 
0, 0.000111068823678012, 1.52848625094731e-07, 2.67039921763476e-06, 
2.67039921763476e-06, 0.000111068823678012, 2.67039921763476e-06, 
0.000111068823678012, 0.000111068823678012, 0), .Dim = c(8L, 
8L), .Dimnames = list(c("1", "2", "3", "4", "5", "6", "7", "8"
), c("1", "2", "3", "4", "5", "6", "7", "8")))
  • 矩阵P打印结果如下:
> P
             1            2            3            4            5            6
1 0.000000e+00 1.110688e-04 1.110688e-04 2.670399e-06 1.110688e-04 2.670399e-06
2 1.110688e-04 0.000000e+00 2.670399e-06 1.110688e-04 2.670399e-06 1.110688e-04
3 1.110688e-04 2.670399e-06 0.000000e+00 1.110688e-04 2.670399e-06 1.528486e-07
4 2.670399e-06 1.110688e-04 1.110688e-04 0.000000e+00 1.528486e-07 2.670399e-06
5 1.110688e-04 2.670399e-06 2.670399e-06 1.528486e-07 0.000000e+00 1.110688e-04
6 2.670399e-06 1.110688e-04 1.528486e-07 2.670399e-06 1.110688e-04 0.000000e+00
7 2.670399e-06 1.528486e-07 1.110688e-04 2.670399e-06 1.110688e-04 2.670399e-06
8 1.528486e-07 2.670399e-06 2.670399e-06 1.110688e-04 2.670399e-06 1.110688e-04
             7            8
1 2.670399e-06 1.528486e-07
2 1.528486e-07 2.670399e-06
3 1.110688e-04 2.670399e-06
4 2.670399e-06 1.110688e-04
5 1.110688e-04 2.670399e-06
6 2.670399e-06 1.110688e-04
7 0.000000e+00 1.110688e-04
8 1.110688e-04 0.000000e+00
  • 需求:提取P每一行中最大的N_largest=7个值对应的列索引。
  • 当前使用doBy包实现,生成结果矩阵r0的代码如下:
library("doBy")
N_largest=7
r0=matrix(apply(P,1,function(x,ns=N_largest) which.maxn(x,n=ns)),nrow = N_largest)
  • 生成的r0结构与打印结果如下(P的行在r0中以列形式存储):
r0=structure(c(2L, 3L, 5L, 4L, 6L, 7L, 8L, 1L, 4L, 6L, 3L, 5L, 8L, 
7L, 1L, 4L, 7L, 2L, 5L, 8L, 6L, 2L, 3L, 8L, 1L, 6L, 7L, 5L, 1L, 
6L, 7L, 2L, 3L, 8L, 4L, 2L, 5L, 8L, 1L, 4L, 7L, 3L, 3L, 5L, 8L, 
1L, 4L, 6L, 2L, 4L, 6L, 7L, 2L, 3L, 5L, 1L), .Dim = 7:8)

> r0
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    2    1    1    2    1    2    3    4
    [2,]    3    4    4    3    6    5    5    6
    [3,]    5    6    7    8    7    8    8    7
    [4,]    4    3    2    1    2    1    1    2
    [5,]    6    5    5    6    3    4    4    3
    [6,]    7    8    8    7    8    7    6    5
    [7,]    8    7    6    5    4    3    2    1
  • 核心疑问:
    1. r0的各列是否真的对应矩阵P每行的7个最大值的列索引?
    2. r0输出是否符合提取每行前N大值位置的预期需求?
结论

r0的结果完全符合提取每行前7大值列索引的默认需求,验证依据如下:

  1. 维度对应正确:apply(P,1,...)按行遍历返回结果,R中matrix默认按列填充,因此r0的第i列恰好对应P第i行的计算结果,维度转换无错误。
  2. 索引集合正确:P每行对角线位置的值为0,其余值均为正数,因此每行最小值就是对角线的0,取前7大值等价于排除对角线列。核对r0每列元素:第1列无1、第2列无2……第8列无8,所有列均正确排除了每行最小值对应的对角线列,包含了其余7个列的索引,无遗漏无多余。
  3. 排序规则正确:doBy::which.maxn默认返回值按从大到小排序,值相等的元素按原向量中的出现顺序排列。核对P每行数值:每行有3个最大值1.110688e-04、3个次大值2.670399e-06、1个第三大值1.528486e-07、1个最小值0,r0每列前3个元素恰好是3个最大值对应的列号(按列出现顺序排列),中间3个是次大值对应的列号(按列出现顺序排列),最后1个是第三大值对应的列号,排序完全符合函数默认规则。

注意:如果业务需求要求等值元素按列号降序或其他自定义规则排序,当前结果的等值顺序不满足要求,需要额外调整排序逻辑;如果无特殊排序要求,当前结果可直接使用。

内容的提问来源于stack exchange,提问作者Tou Mou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:01:03