Matlab bsxfun(@times,…)等效于R
R是否获得了MatlabMatlab bsxfun(@times,…)等效于R,r,matlab,matrix,element,R,Matlab,Matrix,Element,R是否获得了Matlabbsxfun(@times,a,b)的等价物?假设有人想对矩阵a、b执行元素相乘: Matlab: a=[1 0 3 -4]; b=[0 1 5 7; 2 9 -3 4]; bsxfun(@times,a,b) = [0 0 15 -28; 2 0 -9 -16] a<-c(1,0,3,-4) b<-matrix(c(0,2,1,9,5,-3,7,4),nrow = 2,ncol = 4) a * b = matrix(c(0,0,3,-36,5,0,2
bsxfun(@times,a,b)
的等价物?假设有人想对矩阵a、b执行元素相乘:
Matlab:
a=[1 0 3 -4];
b=[0 1 5 7; 2 9 -3 4];
bsxfun(@times,a,b) = [0 0 15 -28; 2 0 -9 -16]
a<-c(1,0,3,-4)
b<-matrix(c(0,2,1,9,5,-3,7,4),nrow = 2,ncol = 4)
a * b = matrix(c(0,0,3,-36,5,0,21,-16),nrow = 2,ncol = 4)
bsxfun("*",repmat(a,2,1),b) # using R {pracma}
R:
a=[1 0 3 -4];
b=[0 1 5 7; 2 9 -3 4];
bsxfun(@times,a,b) = [0 0 15 -28; 2 0 -9 -16]
a<-c(1,0,3,-4)
b<-matrix(c(0,2,1,9,5,-3,7,4),nrow = 2,ncol = 4)
a * b = matrix(c(0,0,3,-36,5,0,21,-16),nrow = 2,ncol = 4)
bsxfun("*",repmat(a,2,1),b) # using R {pracma}
最好使用列主矩阵,因为这是R约定:
> b<-matrix(c(0,2,1,9,5,-3,7,4),nrow = 4,ncol = 2)
> a*b
[,1] [,2]
[1,] 0 5
[2,] 0 0
[3,] 3 21
[4,] -36 -16
由于matrix
函数使用列主位置填充,并且您在其调用中没有指定byrow=TRUE,因此b
-矩阵与您的Matlab矩阵不同
> b3<-matrix(c(0,2,1,9,5,-3,7,4),nrow = 2,ncol = 4, byrow=TRUE)
> sweep(b3, 2, a, '*')
[,1] [,2] [,3] [,4]
[1,] 0 0 3 -36
[2,] 5 0 21 -16
>b3扫描(b3,2,a,'*'))
[,1] [,2] [,3] [,4]
[1,] 0 0 3 -36
[2,] 5 0 21 -16
从执行速度的角度来看,“bsxfun”和“sweep”两种方法都不是最优的。“bsxfun”的性能实际上非常糟糕,对于非玩具应用程序来说似乎毫无用处
在我的基准测试中,最快的是方法
矩阵(a,ncol=n_col,nrow=nsample,byrow=TRUE)*b
当矩阵大小增加时,sweep()
变得更具竞争力,但即使对于中等大小的矩阵(1e6×4),也需要两倍的时间
在下面找到完整的基准
更新:确实有一些bug,比如(1,10,2)的形状阻塞了sweep。因此,我根据sweep的编写方式编写了另一个实现。由于重播,速度有所降低,但仍然快了4倍。实现存放在github回购协议上(标杆取自@g) 我想缩短要扫描的边距,但是
pracma::bsxfun()
没有使用sweep()
。所以我写了以下内容(参见github链接),希望没有bug
标签:R,pracma,数组足够公平。。。谢谢你的建议符合我的期望。然而,对于以下语句,人们可能会有点渴望得到更多信息:“这是R-约定”\uux。最好的办法是,作为R约定的替代方案,我已经用我一直在研究的解决方案编辑了这篇文章,如果您想使用base-R函数,可以使用
sweep
操作。我将发布一个示例。(与pkg:pracma无关。它是一个丰富的有用函数源。它已经存在了很久,并且经过了很好的测试。)感谢使用sweep
提供的附加选项。最好的是,R和包是开源的。显然,没有人想到要通知“pracma”的维护者更好的版本,甚至提供一些代码。好的老习惯去了哪里?只是想澄清一下:问题的实际答案(base-R方式)实际上在下面接受答案的评论中:使用sweep
功能。(它在2016年被添加到答案正文中。)R和包是开源的。显然,没有人想到要通知“pracma”的维护者更好的版本,甚至提供一些代码。好的老习惯到哪里去了?作为一个新手程序员,我现在用StackOverflow来回答大多数问题。也许我们应该鼓励包维护者监视这个论坛,以获得可能的改进。R和包是开源的。显然,没有人想到要通知“pracma”的维护者更好的版本,甚至提供一些代码。好的旧习俗去了哪里?