我很好奇为什么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而不是矩阵,所以我认为它仍然值得一提。
答案 0 :(得分:1)
根据有关回收的一些评论,您所面临的问题类似于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))
答案 1 :(得分: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中存在奇数行,而在第二测试中存在偶数行。你要减去的“sub”迭代遍历矩阵,从mat [1:2,1]开始,然后向下迭代行。当它到达最后一行时,它会绕到第二列。由于在测试1中有一些奇数列,因此计算结果如下:
c(sub[1]-mat[5,1], sub[2]-mat[1,2])
本质上,矩阵在操作发生之前被平展为一个向量,然后被转换回矩阵。