关于使用R语言outer()函数实现矩阵乘法的代码疑问:为何x%*%t(x)与outer(x,x)结果不相等?
问题解析:为什么
all.equal(q, w)不返回TRUE? 嘿,你踩中了R语言里outer()函数和矩阵乘法%*%的核心差异点啦,咱们一步步理清楚:
首先先拆解你的代码细节:
x <- matrix(c(1,2,3,4,5), 5, 5) # 生成5×5矩阵,每行都是1,2,3,4,5(向量长度不足时会循环填充) q <- x %*% t(x) # 线性代数中的矩阵乘法:x 乘以 x 的转置 w <- outer(x, x) # outer函数执行元素对运算 all.equal(q, w) # 比较两者是否相等
1. 先搞懂x %*% t(x)的实际结果
矩阵乘法%*%严格遵循线性代数规则:
- 当
x是5×5矩阵时,t(x)也是5×5矩阵,相乘后得到5×5的矩阵 - 结果矩阵中第
i行第j列的元素,是x的第i行与x的第j行的内积(因为t(x)的第j列就是x的第j行)
比如q[1,2]的计算逻辑是:1*1 + 2*2 + 3*3 +4*4 +5*5 = 55
2. 再看outer(x, x)到底在做什么
outer()函数的本质是对两个输入的所有元素对执行指定运算(默认是乘法*),但有个关键细节:不管你输入的是矩阵还是其他多维结构,它都会先把输入强制转换成向量!
所以outer(x, x)等价于:
outer(as.vector(x), as.vector(x))
as.vector(x)会把5×5的矩阵转换成长度为25的向量(按列优先拆分)- 两两元素相乘后,得到的是25×25的矩阵,每个元素是原矩阵中第m个元素和第n个元素的直接乘积
比如w[1,2]的计算逻辑是:1*2=2,和q[1,2]完全不是一回事
3. 维度差异直接导致all.equal返回FALSE
因为q是5×5矩阵,w是25×25矩阵,两者的维度都不一样,all.equal()自然会返回FALSE(甚至会明确提示维度不匹配的信息)。
小测试直观验证
用一个更小的矩阵来感受差异:
x_small <- matrix(1:4, 2, 2) # 矩阵乘法结果(2×2) q_small <- x_small %*% t(x_small) # outer结果(4×4) w_small <- outer(x_small, x_small) dim(q_small) # 输出 [1] 2 2 dim(w_small) # 输出 [1] 4 4
这下就能明显看出两者的区别啦!outer()不是用来做矩阵乘法的,它的典型应用场景是生成元素对的运算结果,比如制作乘法表这类需求。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

