Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
Matlab bsxfun(@times,…)等效于R_R_Matlab_Matrix_Element - Fatal编程技术网

Matlab bsxfun(@times,…)等效于R

Matlab 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

R是否获得了Matlab
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”的维护者更好的版本,甚至提供一些代码。好的旧习俗去了哪里?