Hi
I am working with a normal mixture model. So I have a 3-D array in Matlab which is an array of covariance matrices - say A( , , ). Here is the Stan code. I have to construct sigma during the code as I cannot do A(, ,i) in Stan (that's what it seems). I also attatched the error message in the end. Please also give me the general recommendation of how to pass multi-dimensional arrays.data {int number_mixtures;int dimension;int dimension_sq;real mixture_weights[number_mixtures];matrix[number_mixtures, dimension] mixture_means;real mixture_covariances[dimension, dimension, number_mixtures];}parameters {vector[dimension] x;}model {real ps[number_mixtures];matrix[dimension, dimension] sigma;for (k in 1:number_mixtures) {for (i in 1:dimension){for (j in 1:dimension){sigma[i,j] <- mixture_covariances[i,j,k];}}ps[k] <- log(mixture_weights[k])+ multi_normal_log(x, mixture_means[k] , sigma);}increment_log_prob(log_sum_exp(ps));}
--
You received this message because you are subscribed to a topic in the Google Groups "Stan users mailing list" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/stan-users/dm-R4jZ6wrA/unsubscribe.
To unsubscribe from this group and all its topics, send an email to stan-users+...@googlegroups.com.
To post to this group, send email to stan-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
% https://github.com/stan-dev/rstan/search?q=stan_rdump&ref=cmdform
% struct or containers.Map
function fid = rdump(fname,content)
if isstruct(content)
vars = fieldnames(content);
data = struct2cell(content);
elseif isa(content,'containers.Map')
vars = content.keys;
data = content.values;
end
fid = fopen(fname,'wt');
for i = 1:numel(vars)
if isscalar(data{i})
if any(data{i}(:) > intmax('int32'))
fprintf(fid,'%s <- %f\n',vars{i},data{i});
else
fprintf(fid,'%s <- %d\n',vars{i},data{i});
end
elseif isvector(data{i})
fprintf(fid,'%s <- c(',vars{i});
if any(data{i}(:) > intmax('int32'))
fprintf(fid,'%f, ',data{i}(1:end-1));
fprintf(fid,'%f)\n',data{i}(end));
else
fprintf(fid,'%d, ',data{i}(1:end-1));
fprintf(fid,'%d)\n',data{i}(end));
end
elseif ismatrix(data{i})
fprintf(fid,'%s <- structure(c(',vars{i});
if any(data{i}(:) > intmax('int32'))
fprintf(fid,'%f, ',data{i}(1:end-1));
fprintf(fid,'%f), .Dim = c(',data{i}(end));
else
fprintf(fid,'%d, ',data{i}(1:end-1));
fprintf(fid,'%d), .Dim = c(',data{i}(end));
end
fprintf(fid,'%g,',size(data{i},1));
fprintf(fid,'%g',size(data{i},2));
fprintf(fid,'))\n');
else
% multidimensional array
fprintf(fid,'%s <- structure(c(',vars{i});
if any(data{i}(:) > intmax('int32'))
fprintf(fid,'%f, ',data{i}(1:end-1));
fprintf(fid,'%f), .Dim = c(',data{i}(end));
else
fprintf(fid,'%d, ',data{i}(1:end-1));
fprintf(fid,'%d), .Dim = c(',data{i}(end));
end
for d = 1:numel(size(data{i}))-1
fprintf(fid,'%g,',size(data{i},d));
end
fprintf(fid,'%g',size(data{i},numel(size(data{i}))));
fprintf(fid,'))\n');
end
end
fclose(fid);
end