R中的矩阵乘法,不使用%*%或crossprod

时间:2014-08-31 09:54:49

标签: r matrix matrix-multiplication cross-product

我试图将R中的两个矩阵相乘而不使用%*%或crossprod。 到目前为止我尝试了什么

x <- matrix(1:4, ncol = 2)
y <- matrix(5:8, ncol = 2)
MatMul <- function(X,Y)
{

  t(apply(x,1,crossprod,y))

}

MatMul(x,y)

我想在不使用crossprod或%*%

的情况下成倍增加

我已经完全坚持这个问题了很长一段时间......所以任何帮助都非常受欢迎。

2 个答案:

答案 0 :(得分:2)

我能想到解决它的唯一方法是使用嵌入式for循环(我自2013年以来的第一次......)

功能

MatMult <- function(x, y){
  res <- matrix(NA, dim(x)[1], dim(y)[2])
    for(i in seq_along(y[1, ])){
     for(j in seq_along(x[, 1])){
      res[j, i] <- sum(x[j, ] * y[, i])
     }
    }
  res
 }

你的矩阵

x <- matrix(1:4, ncol = 2)
y <- matrix(5:8, ncol = 2)

测试

MatMult(x, y)
##      [,1] [,2]
## [1,]   23   31
## [2,]   34   46

x%*%y
##      [,1] [,2]
## [1,]   23   31
## [2,]   34   46

答案 1 :(得分:1)

您也可以尝试:(如果尺寸相同)

indx <- rep(seq(dim(x)[1]), each=dim(x)[1])
res <- apply(x,1, `*`,y) ##assuming that this is okay
res1 <- do.call(`cbind`,by(res, indx, FUN=colSums))
dimnames(res1) <- NULL
res1
#     [,1] [,2]
#[1,]   23   31
#[2,]   34   46

或者

t(colSums(array(apply(x,1, `*`, y), c(dim(x),dim(x)[1]))))
#    [,1] [,2]
#[1,]   23   31
#[2,]   34   46

更新

 x <- matrix(seq_len(9), 3,3) 
 y <- matrix(seq_len(12), 3,4)

 dim1 <- do.call(`pmax`, list(dim(x), dim(y)))
  t(colSums(array(apply(x,1, `*`, y), c(dim1,dim(y)[1]))))
 #    [,1] [,2] [,3] [,4]
 #[1,]   30   66  102  138
 #[2,]   36   81  126  171
 #[3,]   42   96  150  204