我试图将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或%*%
的情况下成倍增加我已经完全坚持这个问题了很长一段时间......所以任何帮助都非常受欢迎。
答案 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