Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将矩阵的每一行乘以r中的向量的好方法_R - Fatal编程技术网

将矩阵的每一行乘以r中的向量的好方法

将矩阵的每一行乘以r中的向量的好方法,r,R,我知道这是一个非常基本的问题,对不起 我想把矩阵的每一行乘以一个向量。因此,我: mat=matrix(1,2,4) vec=c(1,2,3,4) #works but ugly: new.mat=mat for(i in 1:nrow(mat)){ new.mat[i,]=mat[i,]*vec } 我以为我已经用“应用”找到了答案,但我无法用同样的方法找到答案。我想这就是你想要的 t( t(mat) * vec ) [,1] [,2] [,3] [,4] [1,] 1

我知道这是一个非常基本的问题,对不起

我想把矩阵的每一行乘以一个向量。因此,我:

mat=matrix(1,2,4)
vec=c(1,2,3,4)

#works but ugly:
new.mat=mat
for(i in 1:nrow(mat)){
  new.mat[i,]=mat[i,]*vec
}

我以为我已经用“应用”找到了答案,但我无法用同样的方法找到答案。

我想这就是你想要的

t( t(mat) * vec )
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
*
与R中的大多数其他运算符一样,R是矢量化的。
t
是必需的,因为R将按列循环。
apply
解决方案是:

t( apply( mat , 1 , `*` , vec ) )
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4

使用
apply

> t(apply(mat,1 , function(x) x*vec))
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4

我不得不说,最优雅的方式是:

mat=matrix(1,2,4)
vec=1:4
new.mat=t(vec*t(mat))

我更喜欢
扫描
,虽然我觉得稍微慢一点:

sweep(mat,MARGIN=2,vec,"*")

MARGIN=2
指定每列(MARGIN 2)应乘以
vec

的相应元素,非常优雅,就像Simon一样。我对您的进行了升级,因为我喜欢函数包含在单个部分中,而不是被逗号分割