function [f_out] = expecmax(H,g,iter) f_iter = (H')*g; %initial guess h_sum = sum(H,1); %precomute fixed sums for m=1:iter g_iter = H*f_iter; g_div = g./g_iter; g_div(isnan(g_div) | isinf(g_div)) = 0; % open matlabpool for multithreading parfor n=1:length(f_iter) f_next(n)=(f_iter(n)'./h_sum(n))'.*sum(H(:,n).*g_div); end f_iter = f_next'; end f_out = f_iter; end