首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将矩阵中的每个值除以其行/列的最大值。

将矩阵中的每个值除以其行/列的最大值。
EN

Stack Overflow用户
提问于 2014-03-04 21:31:58
回答 3查看 5.9K关注 0票数 9

我试图通过将每个值除以其列或行名的最大值的较小值来转换矩阵中的值。我遇到了问题,因为我不知道如何从更大的函数中查询行/列的特定值。

数据的一小部分如下:加权(对称)邻接矩阵,mat:

代码语言:javascript
复制
              Acousmatic Acoustic Afro-beat Alternative Ambient
  Acousmatic         125       11         3           3       1
  Acoustic            11   112398      1810       24216    3824
  Afro-beat            3     1810     10386        1220     298
  Alternative          3    24216      1220      103286    2838
  Ambient              1     3824       298        2838   20400

作为一个例子,我想转换“替代-声学”(24216)的值,通过找到它的对角线(112398)给出的“声学”的最大值和由它的对角线(103286)给出的“备选声”的最大值,并将“备选-声学”(24216)除以这两个数字中的较小的一个。因此在这种情况下,较小的值是"Alternative“,所以我想将24216/103286=.2345的”替代-声学“值进行转换。

我想要对这个矩阵中的所有值自动执行这个转换,这将导致一个值从0到1的矩阵,其对角线都是1。

我在许多不同的迭代中尝试了以下方法,将"mat“作为矩阵和数据框架,但我不知道如何正确地查询矩阵中每个值的行和列最大值。它使用的是不存在的函数('colmax‘和'rowmax'),但我认为它最清楚地表达了我想要做的事情:

<-应用(mat,1:2,函数(X) x/min(colmax(x),rowmax(X)

我还试图编写一个嵌入式函数,但结果很糟糕,我想知道是否有更简单的解决方案:

代码语言:javascript
复制
rescalemat <- function(mat){
    apply(mat, 1, function(x){
    colmax<-apply(mat, 2, function(x) max(x))
    rowmax<-apply(mat, 1, function(x) max(x))
    x/min(colmax,rowmax)
    mat
})
}

任何帮助都将不胜感激。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-04 21:43:39

试试这个:

代码语言:javascript
复制
A1 = mat/apply(mat,1,max)
A2 = t(t(mat)/apply(mat,2,max))
result = ifelse(A1>A2,A1,A2)
票数 6
EN

Stack Overflow用户

发布于 2014-03-05 00:32:30

除非我遗漏了什么,否则这种方法看起来也是有效的:

代码语言:javascript
复制
res = diag(mat)
#names(res) = colnames(mat)       
mat / outer(res, res, pmin) 

#            Acousmatic  Acoustic  Afro.beat Alternative    Ambient
#Acousmatic       1.000 0.0880000 0.02400000   0.0240000 0.00800000
#Acoustic         0.088 1.0000000 0.17427306   0.2344558 0.18745098
#Afro-beat        0.024 0.1742731 1.00000000   0.1174658 0.02869247
#Alternative      0.024 0.2344558 0.11746582   1.0000000 0.13911765
#Ambient          0.008 0.1874510 0.02869247   0.1391176 1.00000000

其中mat是:

代码语言:javascript
复制
mat = structure(c(125L, 11L, 3L, 3L, 1L, 11L, 112398L, 1810L, 24216L, 
3824L, 3L, 1810L, 10386L, 1220L, 298L, 3L, 24216L, 1220L, 103286L, 
2838L, 1L, 3824L, 298L, 2838L, 20400L), .Dim = c(5L, 5L), .Dimnames = list(
    c("Acousmatic", "Acoustic", "Afro-beat", "Alternative", "Ambient"
    ), c("Acousmatic", "Acoustic", "Afro.beat", "Alternative", 
    "Ambient")))
票数 6
EN

Stack Overflow用户

发布于 2018-11-07 18:14:42

试试下面的代码:

代码语言:javascript
复制
maxcol <- Rfast::colMaxs(x)
maxrow <- Rfast::rowMaxs(x)
Rfast::eachrow(x, min(maxcol, maxrow), oper = "/")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22183503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档