【问题标题】:R subtracting matrix from numeric gives various results depending on the number of matrix rowsR 从数字中减去矩阵会根据矩阵行数给出各种结果
【发布时间】:2015-08-03 18:09:15
【问题描述】:

我很好奇为什么 R 会(显然)根据矩阵中的行数不同地从矩阵中减去数字。注意下面的各种结果:

mat=matrix(rep(1,10),ncol=2)
sub=c(1,100)

test1 = sub - mat

## now increase the number of rows in the matrix, mat.

mat=matrix(rep(1,12),ncol=2)
test2 = sub - mat

为什么test1和test2的结构不同?作为参考,我使用的是 R 版本 3.0.2 (2013-09-25)——“飞盘航行”。 此外,我在这里发现了一个类似的问题:How R subtracts a matrix from an integer,但这是指 data.frame 而不是矩阵,所以我认为它仍然值得一问。

【问题讨论】:

  • 在我看来,您期望的是逐行操作,但 R 正在执行逐列操作(尝试 mat<-matrix(1:10,ncol=2); sub-mat 并查看结果)。这就解释了为什么如果增加行数会得到不同的结果
  • sub 被视为列向量(与所有香草向量一样)并通过矩阵逐列“回收”。你应该看看介绍性的 R 材料,prolly。

标签: r matrix


【解决方案1】:

这些是我运行你的代码得到的结果:

test1      
---     [,1] [,2]  
[1,]    0   99  
[2,]   99   0   
[3,]    0   99  
[4,]   99   0   
[5,]    0   99  

> test2      
---     [,1] [,2]  
[1,]    0    0  
[2,]   99   99  
[3,]    0    0  
[4,]   99   99  
[5,]    0    0  
[6,]   99   99

据我所知,操作并没有什么不同。结果看起来不同,因为在测试 1 中有奇数行,而在第二个测试中有偶数行。您要从中减去的“子”遍历矩阵,从 mat[1:2,1] 开始,然后向下遍历行。当它到达最后一行时,它会环绕到第二列。由于在测试 1 中有奇数列,因此计算如下所示:
c(sub[1]-mat[5,1], sub[2]-mat[1,2])

本质上是在运算发生之前将矩阵展平为向量,然后再转换回矩阵。

【讨论】:

  • 感谢@Danny 的解释。这是我将告诉我的同事避免在他们的代码中出现潜在的灾难性结果的事情。另外,我可以要求您将您的 test1[,2] 结果从 9 编辑到 99 吗?再次感谢!
【解决方案2】:

根据一些关于回收的 cmets,您面临的问题类似于 rep(sub, times=2)rep(sub, each=2) 的结果之间的区别:回收通过根据需要多次重复整个向量来进行(如果只有部分向量需要回收,则发出警告)。

因此,您将通过以下操作获得更相似的模式(即您可能期待的模式):

rep(sub, each=prod(dim(mat))/length(sub)) - mat 

传递给each= 参数的值可能看起来很忙,但我在这里所做的只是预回收,并且以一种与我们看起来“相似”的结果类型的方式进行。

也许对您来说更直观的一种方法是注意减法的逐行应用程序的预期输出;我们可以一次应用减法 1 行(考虑到ncol(mat) == length(sub),这不需要回收单行):

t(apply(mat, 1, function(x)sub-x))

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多