将 R 代码转换为 MATLAB
Convert R code to MATLAB
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')
R 的 dnorm
函数的 MATLAB 等价物是 normpdf
。参数与 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);
如果这不适合您,或者您对代码有任何疑问,请随时发表评论。
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')
R 的 dnorm
函数的 MATLAB 等价物是 normpdf
。参数与 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);
如果这不适合您,或者您对代码有任何疑问,请随时发表评论。