【问题标题】:Matrix Multiplication in R without using %*% or crossprodR中的矩阵乘法,不使用 %*% 或 crossprod
【发布时间】:2014-08-31 09:54:49
【问题描述】:

我试图在不使用 %*% 或 crossprod 的情况下将 R 中的两个矩阵相乘。 到目前为止我已经尝试过什么

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 或 %*% 的情况下进行乘法

我完全被这个问题困住了很久......因此非常欢迎任何帮助。

【问题讨论】:

  • 到目前为止你有什么收获?
  • x
  • 是的。我正在做一项研究工作。所以按照指示,我不必使用它。
  • 你上面的代码使用了crossprod,但是你写了不允许使用它。
  • @edouard 是的.. 我已经使用 crossprod 完成了。但我不允许使用它。这就是我寻找替代品的原因

标签: r matrix matrix-multiplication cross-product


【解决方案1】:

我能想到的唯一解决方法是使用嵌入式 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

【讨论】:

  • 程序似乎有一些错误。您尚未定义 x 维度。可能它会在乘以 x = matrix(1:8, ncol = 4) ,y = matrix(1:20, ncol = 5) 时返回 NA。我建议您在定义演示矩阵时编辑代码并定义 x。
  • 好吧,与其用完整的案例来隐藏你的错误,不如使用 res
  • 只是想分享。我也是先用了complete.cases,后来发现了。
  • 好的,根据您的建议进行修改。我现在在工作,没有足够的时间去想它
【解决方案2】:

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

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

【讨论】:

  • 您不能使用x 作为结果的暗淡。如果y 更大,它将不起作用。检查x &lt;- matrix(seq_len(9), 3,3) ; y &lt;- matrix(seq_len(12), 3,4)的代码
  • @1089 我更新了代码。我没有仔细检查过。可能有错误。大卫·阿伦堡;我用你的例子更新了
  • @akrun 谢谢.. 我认为它有效(到目前为止我已经检查过)
猜你喜欢
  • 2021-01-31
  • 2012-04-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多