我正在将一组相当复杂的代码从Matlab转换为R.我在Matlab中没有经验,在R中是一个功能新手。
我有一段代码读取(在matlab中):
dSii=(sum(tao.*Sik,1))'-(sum(m'))'.*Sii-beta.*Sii./N.*(Iii+sum(Iik)');
我已经简化并将重点放在第一部分(如果我可以解决第一部分,我相信我可以执行其余部分):
J = (sum(A.*B,1))' - ...
(p)(或A)和Sik(或B)是矩阵。所以我的假设是我在这里执行矩阵乘法(A * B)并对结果列求和。 '1'就是在那个声明中让我失望的原因。在R中,1可能表示我们正在讨论行的总和而不是列(由2表示)。但是我找不到任何关于那种Matlab声明的支持文档。
我正在考虑使用这样的声明(当然,太多了'1'和',')
J<- (apply(A*B, 1), 1, sum)
感谢您的帮助。我在这里和其他地方搜索了其他例子,但找不到答案。我愿意为它工作,但这类似于我学习法语(我不知道)用西班牙语翻译(我是温和的),同时用英语解释整个过程。 :d
答案 0 :(得分:1)
由于R和Matlab中的约定不同,必须为每个人学习特质(就像你的语言类比!)。 Matlab命令sum(A.*B,1)
表示在元素方面乘以A和B,因此它们必须是相同的形状,然后沿着维度1求和,即将每一行加在一起以获得列总和。维度1是默认值,因此sum(A.*B)
将与sum(A.*B,1)
执行相同的操作。由于R将*视为矩阵乘法的元素,因此以下Matlab和R代码将在J
中生成相同的数字列:
Matlab:
A=[[1,2,3];[4,5,6];[7,8,9]];
B=[[10,11,12];[13,14,15];[16,17,18]];
J=sum(A.*B,1)'; %the ' means to transpose the column sums to be a 3x1 matrix
R:
A<-matrix(c(1,2,3,4,5,6,7,8,9),3,byrow=T)
B<-matrix(c(10,11,12,13,14,15,16,17,18),3,byrow=T)
J<-matrix(colSums(A*B)) # no transpose needed here: nrow(J)==3