【问题标题】:In R, carry dimension names into a matrix product在 R 中,将维度名称放入矩阵乘积中
【发布时间】:2015-10-07 10:46:26
【问题描述】:

我有两个矩阵 AB 具有维度名称,但没有行或列名称。我想将它们相乘并继承维度名称。具体来说,我想将A(一个m乘n矩阵,行维称为“变量”,列维称为“学生”)的转置乘以B(一个m乘q矩阵,行维称为“系数”,列维度称为“模型”)得到C(一个n乘q矩阵,行维度称为“学生”,列维度称为“模型”)。下面的代码生成正确的矩阵,但没有维度名称。

A = matrix(data = c(1:5, 10*(1:5)), nrow = 2, dimnames = list("Variables" = NULL, "students" = NULL))
B = matrix(data=c(1:6), nrow = 2, dimnames = list("Coefficients" = NULL, "models" = NULL))
A
B
dim(A)
dim(B)
dimnames(A)
dimnames(B)
C = crossprod(A,B)
C
dim(C)
dimnames(C)

我希望输出(仅运行变量 C)如下所示:

        Models
students [,1] [,2] [,3]
    [1,]    5   11   17
    [2,]   11   25   39
    [3,]   25   55   85
    [4,]   80  180  280
    [5,]  140  320  500

【问题讨论】:

  • 你能显示预期的输出吗?这两个矩阵有不同的暗名。最好知道你的期望。
  • 实际上你是在B上乘以转置的A,比较t(A) %*% B
  • akrun - 好点。我添加了预期的输出。大卫阿伦伯格 - 好点。我在问题中修复了它。
  • 可能一个班轮`dimnames<-`(t(A) %*% B, setNames(list(NULL, NULL), c(names(dimnames(A))[2], names(dimnames(B))[2])))

标签: r matrix


【解决方案1】:

我认为您不能直接使用 crossprod 来执行此操作,但我在它周围包裹了一小段似乎可以工作的代码:

crossprod2 <- function(x, y){
  row <- names(dimnames(x))[2] #save row name
  col <- names(dimnames(y))[2] #save col name
  cp <- crossprod(x,y)         #run crossprod
  dimnames(cp) <- list(NULL,NULL)   #create dimnames
  names(dimnames(cp)) <- c(row,col) #set the correct names
  cp 
 }

或者,根据@PauldeBarros 的评论,您也可以这样做:

crossprod2 <- function(x, y){ row <- dimnames(x)[2] #save row names 
                              col <- dimnames(y)[2] #save col names 
                              dn = list(row[[1]], col[[1]]) 
                              names(dn) = list(names(row), names(col)) 
                              cp <- crossprod(x,y) #run crossprod 
                              dimnames(cp) <- dn #apply dimnames cp 
                              cp
}

在这种情况下,任何行名或列名都将被保留(如果存在)。

输出:

> crossprod2(A,B)
        models
students [,1] [,2] [,3]
    [1,]    5   11   17
    [2,]   11   25   39
    [3,]   25   55   85
    [4,]   80  180  280
    [5,]  140  320  500

【讨论】:

  • 这很好,但会丢失行名和列名(如果存在)。有趣的是,只要存在 rownames 和 colnames,crossprod 就会保留这些 AND 维度名称。对于一般情况,crossprod2 &lt;- function(x, y){ row &lt;- dimnames(x)[2] #save row names col &lt;- dimnames(y)[2] #save col names dn = list(row[[1]], col[[1]]) names(dn) = list(names(row), names(col)) cp &lt;- crossprod(x,y) #run crossprod dimnames(cp) &lt;- dn #apply dimnames cp }
  • @PauldeBarros 是的,您建议的方式效果很好。显然,您正在发布问题,因此您的想法比我自己多得多。我只是尝试使用我拥有的可用信息来解决问题。我将在此处添加替代方案,以供遇到相同问题的人参考。
猜你喜欢
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2019-03-10
  • 1970-01-01
  • 2018-03-28
  • 2020-12-06
相关资源
最近更新 更多