How to replace use of cell storage with use of arrays?

1 visualizzazione (ultimi 30 giorni)
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 Commenti
POLLY
POLLY il 24 Set 2018
They are the matrices 500*500 that were randomly generated for each i,j,k
James Tursa
James Tursa il 24 Set 2018
What code do you currently use to save and access the cells?

Accedi per commentare.

Risposta accettata

Nicole Peltier
Nicole Peltier il 24 Set 2018
Modificato: Nicole Peltier il 24 Set 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 Commenti
Nicole Peltier
Nicole Peltier il 26 Set 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
Stephen23 il 27 Set 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.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Oil, Gas & Petrochemical in Help Center e File Exchange

Prodotti

Community Treasure Hunt

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

Start Hunting!

Translated by