How to replace use of cell storage with use of arrays?
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Thanks for taking the time to read this. This is a part of the script I'm working on:
resultX0=cell(length(n),length(q), ntrials);
resultY0=cell(length(n),length(q), ntrials);
resultG=cell(length(n),length(q), ntrials);
for i=1:length(n)
for j=1:length(q)
for k=1:1:ntrials
[G,X0,Y0]=matrix_plantsubm(M,N,c,n(i),p,q(j));
resultX0{i,j,k}=X0;
resultY0{i,j,k}=Y0;
resultG{i,j,k}=G;
end
end
end
I would like to replace use of cell storage with use of arrays (e.g. resultG{i,j,k} = G). I want to run the function 10 times (in this case ntrials) for each value q and n. How can I do that?
Thanks
5 commentaires
Réponse acceptée
Nicole Peltier
le 24 Sep 2018
Modifié(e) : Nicole Peltier
le 24 Sep 2018
According to a previous time you posted about matrix_plantsubm.m on Matlab Answers (thanks Google!), it looks like G, X0, and Y0 are all MxN matrices. Therefore, you could declare resultX0, resultY0, and resultG as follows:
resultX0 = zeros(length(n), length(q), ntrials, M, N);
resultY0 = zeros(length(n), length(q), ntrials, M, N);
resultG = zeros(length(n), length(q), ntrials, M, N);
Then your for-loops should look like this:
for i=1:length(n)
for j=1:length(q)
for k=1:ntrials
[G,X0,Y0]=matrix_plantsubm(M,N,c,n(i),p,q(j));
resultX0(i,j,k,:,:)=X0;
resultY0(i,j,k,:,:)=Y0;
resultG(i,j,k,:,:)=G;
end
end
end
Hope this helps!
5 commentaires
Nicole Peltier
le 26 Sep 2018
Is there a reason why this loop must be separate from the previous one? If not, I'd recommend combining the loops like this:
% Declare all variables here
resultX0 = zeros(length(n), length(q), ntrials, M, N);
resultY0 = zeros(length(n), length(q), ntrials, M, N);
resultG = zeros(length(n), length(q), ntrials, M, N);
resultX=zeros(length(n),length(q), ntrials, M, N);
resultY=zeros(length(n),length(q), ntrials, M, N);
for i=1:length(n)
for j=1:length(q)
gamma = 6/((q(j) - p)*n(i));
for k=1:ntrials
% The following code is from the first loop
[G,X0,Y0]=matrix_plantsubm(M,N,c,n(i),p,q(j));
resultX0(i,j,k,:,:)=X0;
resultY0(i,j,k,:,:)=Y0;
resultG(i,j,k,:,:)=G;
% Consolidate code from second loop into first one
[X,Y,Q, iter] = ADMM(G, c, n(i), gamma, tau, opt_tol, verbose);
resultX(i,j,k, :, :)=X;
resultY(i,j,k, :, :)=Y;
end
end
end
This way, you can use the variable G which you've already calculated instead of having to select the correct index out of resultG. (Otherwise you'll have to use resultG(i,j,k,:,:) as your input argument to ADMM.)
Stephen23
le 27 Sep 2018
You might also like to consider ordering the dimensions slightly differently, to keep the matrices as the first two dimensions:
(M, N, length(n), length(q), ntrials)
That might make processing/accessing the data easier later.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!