不同维度矩阵相减报错non-conformable arrays问题求助
解决R中矩阵减法维度不匹配的问题
嘿,这个问题我太熟了——你遇到的non-conformable arrays报错,本质是R的矩阵算术运算规则在起作用:矩阵之间的加减乘除要求两个矩阵的行数和列数完全一致。你的B是100行3列,C是100行1列,维度对不上,R不知道该怎么把1列的C对应到3列的B上,自然就报错了。
你的需求是生成100行3列的矩阵A,让B的每一行的三个元素,分别减去C对应行的那个元素——说白了就是把C“广播”成100行3列的矩阵(每一列都是原C的内容),再和B做减法。这里有几种简单高效的实现方法:
方法1:直接扩展C的维度
用matrix()函数把C重新构造成100行3列的矩阵,每列重复原C的内容:
# 先模拟你的数据(方便复现) set.seed(123) B <- matrix(rnorm(300), nrow = 100, ncol = 3) C <- matrix(rnorm(100), nrow = 100, ncol = 1) # 生成矩阵A A <- B - matrix(C, nrow = 100, ncol = 3)
方法2:用索引重复C的列
通过索引提取C的第1列,重复3次,直接和B运算:
A <- B - C[, rep(1, 3)]
方法3:用cbind复制C列
如果列数少(比如这里是3列),直接用cbind()把C复制三次:
A <- B - cbind(C, C, C)
这三种方法都能达到你要的效果,其中方法1和方法2更通用——如果以后B的列数变了,只要修改ncol或者rep()里的数字就行,不用手动写多次C。
内容的提问来源于stack exchange,提问作者Sander




