将R代码转换为MATLAB

将R代码转换为MATLAB,r,matlab,translation,R,Matlab,Translation,具有虚拟数据的算法的r代码: 我正在努力将其转换为MATLAB,但在循环内部运行的计算中遇到了困难。任何帮助都将不胜感激 data <- c(-0.39, 0.12, 0.94, 1.67, 1.76, 2.44, 3.72, 4.28, 4.92, 5.53, 0.06, 0.48, 1.01, 1.68, 1.80, 3.25, 4.12, 4.60, 5.28, 6.22) pi <- 0.546 sigmas1 <- 0.87 s

具有虚拟数据的算法的r代码: 我正在努力将其转换为MATLAB,但在循环内部运行的计算中遇到了困难。任何帮助都将不胜感激

data <- c(-0.39, 0.12, 0.94, 1.67, 1.76, 2.44, 3.72, 
       4.28, 4.92, 5.53, 0.06, 0.48, 1.01, 1.68, 1.80, 
       3.25, 4.12, 4.60, 5.28, 6.22) 
pi <- 0.546  
sigmas1 <- 0.87 
sigmas2 <- 0.77 
mu1 <- numeric(0) 
mu2 <- numeric(0) 
r   <- numeric(0) 
R1  <- matrix (0 ,20 ,100) 
mu1[1] <- 4.62 
mu2[1] <- 1.06

for(j in 1:100){
  for ( i in 1:20){
    r [i] <- pi * dnorm (data[i] , mu2[j], sigmas2^(1/2))/((1-    pi)*dnorm(data[i], 
        mu1[j], sigmas1^(1/2))+ pi*dnorm(data[i], mu2[j], sigmas2^(1/2))) 
R1[i, j] <- r[i] 
}
r
mu1[j+1] <- sum((1-r)*data)/sum(1-r)
mu2[j+1] <- sum(r*data)/sum(r) 
Muu1 <- mu1[j+1]
Muu2 <- mu2[j+1]
}

Muu1
Muu2
x11() 
layout(matrix(c(1, 2))) 
plot(mu1, type="l", main="", xlab="EM Iteration for the Fictitious Data")
plot(mu2, type="l", main="", xlab='EM Iteration for the Fictitious Data') 

dataR的
dnorm
函数的MATLAB等价物是。参数与R中的参数相同:

normpdf(X,mu,sigma)
这样,for循环就可以很容易地进行调整。由于
normpdf
函数允许向量作为输入,因此您可以转储内部for循环并使用向量化方法。请始终记住,
*
/
是MATLAB中的矩阵乘法和除法。要获取元素级运算符,请改用
*
/

请注意,在MATLAB中,最好预先分配所有变量。当
mu1
mu2
从1变为100时,但在每个步骤中设置值
mu[j+1]
,其大小将为
1x101
。对于
r
R1
来说,我认为大小是明确的

总之,这将产生以下代码:

data = [-0.39, 0.12, 0.94, 1.67, 1.76, 2.44, 3.72,...
    4.28, 4.92, 5.53, 0.06, 0.48, 1.01, 1.68, 1.80,...
    3.25, 4.12, 4.60, 5.28, 6.22];

pi=0.546;
sigmas1 = 0.87;
sigmas2 = 0.77; 
mu1 = zeros(1,101);
mu2 = zeros(1,101);
r = zeros(1,20);
R1 = zeros(20,100);
mu1(1) = 4.62;
mu2(1) = 1.06;

for j=1:100
    r= pi*normpdf(data,mu2(j),sigmas2^(1/2)) ./ ...
        ((1-pi)*normpdf(data,mu1(j),sigmas1^(1/2)) + ...
         pi*normpdf(data,mu2(j),sigmas2^(1/2)));
    R1(:,j) = r;
    mu1(j+1) = sum((1-r).*data)/sum(1-r);
    mu2(j+1) = sum(r.*data)/sum(r);
end

figure;
subplot(1,2,1);
plot(mu1);
subplot(1,2,2);
plot(mu2);

如果这不适合你,或者你对代码有任何疑问,请随意评论。

如果您只需要在matlab中运行它,那么这应该会对您有所帮助哦,不。我必须将其转换为matlab并使用真实数据,因为这一个只使用虚拟数据。为什么不学习matlab或继续使用R进行编码。请确保您没有考虑将所有R代码的所有转换工作交给有帮助的人来完成大家好吗?我投票结束这个问题,因为这是一个“给我代码”的问题,非常好的广告。我正在努力重新分配mu1、mu2和r的内存,混淆了cell()或zero(),得到了这样一条消息“试图访问mu1(2);索引超出范围,因为numel(mu1)=1”。情节很好。多谢。