我有一个5列4行的矩阵。我也有一个3列的向量。我想在矩阵的每一行分别减去向量中第3、4和5列的值。
b <- matrix(rep(1:20), nrow=4, ncol=5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
c <- c(5,6,7)
得到
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 4 7 10
[2,] 2 6 5 8 11
[3,] 3 7 6 9 12
[4,] 4 8 7 10 13
7条答案
按热度按时间flvtvl501#
这正是
sweep
的用途:..或者甚至不进行子集化或重新分配:
rjzwgtxy2#
也许不是那么优雅,但是
应该可以我们对矩阵进行子集化,只改变我们需要的部分,并使用
t()
(转置)来翻转矩阵,因此简单的向量循环将负责从正确的行中减去。如果你想避免转置,你可以做一些像
在这里,我们使用两次子集,并使用第二次来为
x
中的每个值获取正确的列,因为这两个矩阵将以相同的顺序索引。我想我最喜欢的问题是@thelatemail链接的问题
l5tcr1uw3#
另一种方法,使用apply:
gab6jxml4#
一个简单的解决方案:
kxeu7u2r5#
这可以用
rray
package以一种非常令人满意的方式完成(使用其(类似numpy的)广播-
运算符%b-%
):对于大型矩阵,这甚至比
sweep
更快:odopli946#
出于性能考虑,{collapse}包中的运算符
%r-%
是最好的。请参见以下基准:创建于2023-05-22使用reprex v2.0.2
虽然对于较大的矩阵,{rray}
%b-%
可能比sweep
更快,但{collapse}%r-%
优于所有其他方法。dojqjjoe7#
我们可以使用
outer
来创建掩码矩阵msk
,然后从b
中减去它,例如,