eval is giving wrong results
3 views (last 30 days)
Show older comments
Hi, all
I do have a function running within some loops and create variables with dynamically generated names based on the values of the loops.
The result of my function is a 1000 x 50 matrix of integers. I want to plot the mean of each collumn. Therefore, here's the code
% Distribuição de espécies em grupos
for tipoQSG = tipoQSGmin:tipoQSGmax
for gradienteQSG = gradienteQSGmin:gradienteQSGmax
% Interações interespecíficas
for tipoSIS = tipoSISmin:tipoSISmax
for quantidadeSIS = quantidadeSISmin:quantidadeSISmax
for concentracaoSIS = concentracaoSISmin:concentracaoSISmax
for sinaisSIS = sinaisSISmin:sinaisSISmax
for aleatorizacaoSIS = aleatorizacaoSISmin:aleatorizacaoSISmax
% Efeito de grupos funcionais
for tipoSEG = tipoSEGmin:tipoSEGmax
for sinalSEG = sinalSEGmin:sinalSEGmax
MPDF = myfunc(tipoQSG, gradienteQSG, tipoSIS, quantidadeSIS, concentracaoSIS, sinaisSIS, aleatorizacaoSIS, tipoSEG, sinalSEG)
end end end end end end end end end
I have no problems doing what I need if I type manually, for instance:
plot(mean(MPDF_111111111))
However, when I try to do it in a dynamic way, it fails.
% Distribuição de espécies em grupos
for tipoQSG = tipoQSGmin:tipoQSGmax
for gradienteQSG = gradienteQSGmin:gradienteQSGmax
% Interações interespecíficas
for tipoSIS = tipoSISmin:tipoSISmax
for quantidadeSIS = quantidadeSISmin:quantidadeSISmax
for concentracaoSIS = concentracaoSISmin:concentracaoSISmax
for sinaisSIS = sinaisSISmin:sinaisSISmax
for aleatorizacaoSIS = aleatorizacaoSISmin:aleatorizacaoSISmax
% Efeito de grupos funcionais
for tipoSEG = tipoSEGmin:tipoSEGmax
for sinalSEG = sinalSEGmin:sinalSEGmax
% Checa-se a execução satisfatória do cenário adotado anteriormente. Se
% ele já tiver sido executado em número suficiente de vezes,
% ignora-se-o e passa-se ao próximo.
% Checa se os resultados existem.
% dynamical plot attempt eval(['plot(' 'mean(' 'sprintf(''MPDF_%d%d%d%d%d%d%d%d%d'', tipoQSG, gradienteQSG, tipoSIS, quantidadeSIS, concentracaoSIS, sinaisSIS, aleatorizacaoSIS, tipoSEG, sinalSEG)' ')' ')' ])
% manual plot attempt
plot(genvarname(sprintf('MPDF_%d%d%d%d%d%d%d%d%d', tipoQSG, gradienteQSG, tipoSIS, quantidadeSIS, concentracaoSIS, sinaisSIS, aleatorizacaoSIS, tipoSEG, sinalSEG)))
hold on
% Try to see if the variable name might be wrong
eval(['sprintf(''MPDF_%d%d%d%d%d%d%d%d%d'', tipoQSG, gradienteQSG, tipoSIS, quantidadeSIS, concentracaoSIS, sinaisSIS, aleatorizacaoSIS, tipoSEG, sinalSEG)' ]) == MPDF_111111111
end
end
end
end
end
end
end
end
end
Why does it returns me a vector for the mean(MPDF_111111111), but a single value for the for the eval equivalent? How can I remedy this problem?
Thanks!
2 Comments
Stephen23
on 15 Oct 2014
In case the message got lost: DO NOT USE EVAL for calling trivial functions like sprintf. This is a topic that has been discussed a thousand times before...
- Eval isn't fast, it is slower than just calling any function directly.
- Eval obscures the code intent. Totally.
- Eval is not compiled for optimized running. Every call has to eval all over again!
- Eval makes debugging almost impossible.
- Eval can produce different outputs in normal and debug modes.
- Eval can create and overwrite variables in workspaces.
- Eval is often associated with other practices that are not an efficient use of MATLAB... sequential variable names, for example.
These topics have been covered many times in MATLAB's official documentation, blogs and other discussions:
Accepted Answer
Daniel Shub
on 25 Mar 2012
I don't really understand your question and we cannot run your code ...
It looks like:
plot(genvarname(sprintf('MPDF_%d%d%d%d%d%d%d%d%d', tipoQSG, gradienteQSG, tipoSIS, quantidadeSIS, concentracaoSIS, sinaisSIS, aleatorizacaoSIS, tipoSEG, sinalSEG)))
is trying to plot a string
plot('MPDF_111111111')
is odd.
Here
eval(['sprintf(''MPDF_%d%d%d%d%d%d%d%d%d'', tipoQSG, gradienteQSG, tipoSIS, quantidadeSIS, concentracaoSIS, sinaisSIS, aleatorizacaoSIS, tipoSEG, sinalSEG)' ]) == MPDF_111111111
you seem to be comparing
eval('MPDF_111111111') == MPDF_111111111
which again is odd.
Overall I guess my answer is: DON'T USE EVAL!!!!
It makes debugging a pain.
Taking another look: Are you trying to do
eval('plot(mean(MPDF_111111111))')
5 Comments
More Answers (1)
See Also
Categories
Find more on Scope Variables and Generate Names in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!