【问题标题】:Matrix multiplication - loose definition of non-conformable matrices矩阵乘法 - 不符合矩阵的松散定义
【发布时间】:2012-12-19 00:00:31
【问题描述】:

假设我们有以下内容:

x <- matrix(1:9, nrow=3)
y <- c(1,2,3)
x%*%y
y%*%x

为什么矩阵乘法不是未定义的?我们知道x 是一个 3 x 3 矩阵,y 是一个 1 x 3 矩阵。所以x %*% y 不应该被定义,y %*% x 应该是一个 1 x 3 矩阵。

【问题讨论】:

  • 答案在help("%*%")输出的第一部分。

标签: r matrix


【解决方案1】:

幸运的是(或不幸的是,视情况而定)许多 R 运算符(在其默认状态下)被重载并在“幕后”执行各种操作 - 在此示例中,@987654322 中 %*% 的默认功能@ 自动将 y 强制转换为维度有效的矩阵。当你输入

x %*% y 

它使y 成为一个 3 x 1 矩阵,当你输入时

y %*% x 

它使y 成为一个 1 x 3 矩阵。

尝试将它们与您键入时进行比较

x %*% as.matrix(y) 

t(as.matrix(y)) %*% x

分别

【讨论】:

  • 我投票支持“不幸”。我的经验是,R 中的 implicit 强制通常会导致模糊、难以检测和难以调试的行为,而 explicit 强制工具的能力却令人抓狂。 “错误”的事情! :-) 尽管存在许多不同的缺陷,但总的来说,我仍然喜欢 R 并经常使用它。
  • +1 表示“不幸”。已经有很多统计数据包试图为用户思考......
  • 如果你还在胡思乱想,那么你也应该提到当你提取单个列时会发生什么:(x%*%y)[,1]
  • @DWin,我不确定你在做什么。一旦你做了乘法,例如x%*%y,创建了一个新矩阵,但它必须强制执行乘法运算,然后您只需像往常一样索引该矩阵。因此,x%*%y 将 (3 x 3) 乘以 (3 x 1) 得到 (3 x 1),因此提取第一列只会给出长度为 3 的向量,而 y%*%x 则有 (1 x 3) 所以第一列只是一个标量。我可能错过了你的意思......
  • 归根结底(我个人的推论)是 R 主要是一种数据分析工具,因此矩阵运算是为 DWIM 设计的,其中“I”是统计学家。或者,Matlab 的 DWIM 旨在将“I”作为线性代数。
猜你喜欢
  • 2017-03-11
  • 2013-12-23
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多