如何修复R中sweep函数报‘STATS is longer than...’警告及错误结果?
问题解决思路
首先修正代码中的基础错误
你的代码里V变量未定义,这是第一个必须解决的问题,先补充定义(假设V是U的笔误,可根据实际场景替换):
V <- U
警告原因与核心问题
sweep函数的作用是对矩阵的指定维度(行/列),用一个向量与该维度的每个元素做运算,而非实现矩阵乘法。你最后一行代码出现警告的原因是:
C^-1是对矩阵C逐元素取逆,得到的是3×3矩阵,长度为9sweep(BU, 2, C^-1, '*')中,MARGIN=2指定按列运算,dim(BU)[2]是3,STATS(即C^-1)的长度远大于目标维度的长度,R会循环广播STATS,导致运算逻辑错误,同时抛出警告。
另外,C^-1是逐元素取逆,而非矩阵逆运算,这也和你“矩阵相乘”的需求不符。
正确实现矩阵相乘的代码
若你需要的是矩阵乘法(而非逐元素相乘),应使用R中的矩阵乘法运算符%*%,配合solve()函数求矩阵逆:
U <- matrix(c(4,2,4,2,5,2,6,1,3), nrow = 3, ncol = 3, byrow=TRUE) V <- U # 补充定义V g <- matrix(c(23,37,20), nrow = 3, ncol = 1, byrow = TRUE) # 保留原正确的sweep运算,将g转成向量避免维度问题 BU <- sweep(U, 2, as.vector(g)^-1, `*`) C <- sweep(t(V), 2, as.vector(g)^-1, `*`) # 矩阵乘法:BU 乘以 C 的逆矩阵 AU <- BU %*% solve(C)
若需求是逐元素相乘
如果你实际需要的是逐元素相乘(而非矩阵乘法),直接用*运算符即可,无需sweep:
# 逐元素相乘,需确保BU和C^-1维度一致 AU <- BU * (1/C) # 1/C等价于C^-1,逐元素取逆
内容的提问来源于stack exchange,提问作者Luper Osterfuchs
相关产品推荐
相关产品推荐

