R中c()拼接生成向量为行还是列?矩阵乘法非一致性报错求解
R矩阵与向量乘法常见问题解释
1. 核心误区:R中c()生成的不是严格的行/列向量
- R里用
c()拼接得到的是一维原子向量,本身没有行、列维度属性,只有长度属性。你可以用dim(ExampleConCat)测试,返回结果是NULL,而矩阵的dim()会返回[行数 列数]。 - 当一维向量和矩阵用
%*%做矩阵乘法时,R会自动根据矩阵的维度,把向量临时转换为匹配的行/列向量:- 向量在
%*%右侧时,会优先转成列向量(行数=向量长度,列数=1) - 向量在
%*%左侧时,会优先转成行向量(行数=1,列数=向量长度)
- 向量在
2. 为什么MatrixExample %*% ExampleConCat能正常运行
你用到的MatrixExample是20行4列(20×4)的矩阵,矩阵乘法要求前一个矩阵的列数 = 后一个矩阵的行数。
此时一维向量ExampleConCat长度为4,在乘法右侧被R自动转成4行1列(4×1)的列向量,20×4和4×1的维度刚好匹配,运算结果就是你拿到的20行1列的矩阵。
你算出来的结果本质上就是把
MatrixExample每行的前3个值相加:State A + State B + State C,和你给的ExampleConCat = c(1,1,1,0)的规则完全一致,你可以随便抽一行验证,比如cycle_1的三个值相加:0.721453287+0.201845444+0.06689735 ≈ 0.990196,和结果完全对应。
3. 为什么反过来运算会报错
当你执行ExampleConCat %*% MatrixExample时,向量在乘法左侧,R会自动把它转成1行4列(1×4)的行向量,而后面的MatrixExample是20行4列(20×4)的矩阵。
此时矩阵乘法要求前一个的列数(4)等于后一个的行数(20),4≠20,维度不匹配,就会抛出non-conformable arguments(参数维度不兼容)的报错。
如果你想要实现行向量乘矩阵的运算,需要把MatrixExample转置为4行20列的矩阵,代码如下:
# t()函数用于矩阵转置 matrix.multipl2 <- t(ExampleConCat) %*% t(MatrixExample)
4. 怎么避免维度歧义
如果不想让R自动转换向量维度,可以手动把一维向量转成明确的矩阵,指定行列属性:
# 强制转成4行1列的列向量 col_vec <- matrix(ExampleConCat, ncol = 1) # 强制转成1行4列的行向量 row_vec <- matrix(ExampleConCat, nrow = 1)
手动指定后再做矩阵乘法,就会严格遵循标准矩阵乘法规则,不会出现自动适配的情况。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

