在R中,将维度名称带入矩阵乘积

时间:2015-10-07 10:46:27

标签: r matrix

我有两个矩阵AB,其中包含维名称,但没有行名或列名。我想将它们相乘并继承尺寸名称。具体来说,我想将A的转置(一个m乘n矩阵,行维度称为“变量”和列维度称为“学生”)乘以B(m乘q矩阵)使用称为“Coefficients”的行维度和称为“models”的列维度来获取C(n为q矩阵,行维度称为“Students”,列维称为“Models”)。下面的代码生成了正确的矩阵,但没有维度名称。

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

1 个答案:

答案 0 :(得分:3)

我不认为你可以直接使用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