如何用mapply对两个矩阵行执行带权重矩阵的内积计算?
解决mapply传递矩阵参数的问题
错误原因
直接将矩阵W传入mapply时,函数会自动将矩阵拆分为单个标量元素(此处为重复的1),导致每次调用inn.prod时,W变成数值1而非原矩阵,触发矩阵乘法维度不兼容的错误。用simplify2array(Q)处理后的数组同样会被mapply拆分,无法完整传递原矩阵。
正确写法
方法1:使用MoreArgs参数(推荐)
mapply的MoreArgs参数可指定需要完整传递给每个函数调用的额外参数,不会被拆分:
X = matrix(1:9,3,3) Y = matrix(1,3,3) W = matrix(1,3,3) inn.prod = function(x,y,W){ t(x) %*% W %*% y } # 正确调用方式 mapply(inn.prod, asplit(X, 1), asplit(Y, 1), MoreArgs = list(W = W))
执行后会返回正确的加权内积结果:36 45 54。
方法2:将W包装为单元素列表
把W放在一个单元素列表中传入,mapply会将列表中的完整矩阵传递给每个函数调用:
mapply(inn.prod, asplit(X, 1), asplit(Y, 1), list(W), SIMPLIFY = FALSE)
若需要向量形式的结果,可去掉SIMPLIFY=FALSE参数。
函数优化(可选)
原函数中手动将x、y转为矩阵的步骤可简化,利用R中向量的默认处理逻辑,直接用t(x)转置行向量即可:
inn.prod = function(x, y, W){ t(x) %*% W %*% y }
该写法与原函数功能完全一致,代码更简洁。
内容的提问来源于stack exchange,提问作者legon
相关产品推荐
相关产品推荐

