how to extract variables from cell (dot operators)

5 Ansichten (letzte 30 Tage)
I have a 1x19 cell with gmdistributions (BestModel). Each one of these cells gm distribution has mu values that I need, and I want to store in some sort of array so that I can plot these vs iterating sigma_main value. How can I do this? The variables get stored in the cell by using "fitgmdist" and are accessible via dot operator.
For every sigma_main value, I want the mu values to be extracted and then plotted vs sigma_main. There might be 1,2,3, or 4 mu values for every sigma_main depending on the numComponents.
Does this make sense? Here is my code:
%% define known constants
% rng(0,'twister')
n_main = 100000;
n_sub = 10000;
sigma_main = 0.1;
sigma_sub = 0.1;
mu_main = 1;
mu_sub =3;
%% change sigma_main values and run model
sigmamain_val = 0.1:0.05:1;
outputData = zeros(length(sigmamain_val), 2); % create an output array for (length sigma_sub),numComponents (19x2 double)
BestModel = cell(numel(sigma_main),1); % pre-allocate array to hold fitgmdist outputs (1x19 cell)
for i = 1:length(sigmamain_val)
%sigmamain_pos = randi(length(sigmamain_val));
sigmamain_pos = i; %iteration
sigma_main = sigmamain_val(sigmamain_pos); % sigma main from every iteration
y = sigma_main.*randn(n_main,1) + mu_main; %100000 main cells
y2 = sigma_sub.*randn(n_sub,1) + mu_sub; %10000 sub MB 231
C = cat(1, y, y2);
AIC = zeros(1,4); % create an ouput array for AIC
GMModels = cell(1,4); %pre allocate (1x4 cell)
options = statset('MaxIter',00); % add optitons here to better/refine the model
%mu = zeros(2,1);
for k = 1:4
GMModels{k} = fitgmdist(C,k);
AIC(k)= GMModels{k}.AIC;
%mu(k) = GMModels{k}.mu
end
[minAIC,numComponents] = min(AIC);
outputData(i,1) = sigma_main;
outputData(i,2) = numComponents;
%BestModel = GMModels{numComponents} %gives only one sigma main
BestModel{i} = GMModels{outputData(i,2)}; %(1x19 cell with gm distributions)
end
%% plot sigma main vs numComponents
figure(3)
scatter(outputData(:,1),outputData(:,2))
xlabel('sigma main')
ylabel('numComponents')
I tried:
mu(k) = GMModels{k}.mu
I also tried
mu{k} = GMModels{k}.mu
But I get the error that the "left and right side are not equivalent".
Please tell me how to do this (pre allocate, inside for loop, and after) and how to plot this if you can

Akzeptierte Antwort

Thiago Henrique Gomes Lobato
Bearbeitet: Thiago Henrique Gomes Lobato am 31 Mai 2020
You don't need to pre allocate since the best models are already in your cell array. I believe what you want may be something like this:
%% Plot mu with sigmain
figure,
for idx=1:length(BestModel)
mu = BestModel{idx}.mu; % get all mu's
plot(ones(size(mu,1),1)*sigmamain_val(idx),mu,'bo') % plot all in the same sigma value as scatter plot
hold on
end
xlabel('Sigma')
ylabel('mu')
  3 Kommentare
Elizabeth Cardona
Elizabeth Cardona am 31 Mai 2020
Bearbeitet: Elizabeth Cardona am 31 Mai 2020
Is there anyway these mu values can be stored in an array so that I can work with them later? I believe right now, "mu" just takes the last iteration.
Thiago Henrique Gomes Lobato
yes, one way could be:
...
BestModel = cell(numel(sigma_main),1); % pre-allocate array to hold fitgmdist outputs (1x19 cell)
Allmus = cell(numel(sigma_main),1);
for i = 1:length(sigmamain_val)
...
mutemp = cell(4,1);
for k = 1:4
GMModels{k} = fitgmdist(C,k);
AIC(k)= GMModels{k}.AIC;
mutemp{k} = GMModels{k}.mu;
end
Allmus{i} = mutemp;
...

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu 2-D and 3-D Plots finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by