eval is giving wrong results

조회 수: 4 (최근 30일)
Igor de Britto
Igor de Britto 2012년 3월 25일
댓글: Stephen23 2014년 10월 15일
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
Igor de Britto
Igor de Britto 2012년 3월 25일
Managed to get MPDF_111111111 and the loop variables on the question!
Stephen23
Stephen23 2014년 10월 15일
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:

댓글을 달려면 로그인하십시오.

채택된 답변

Daniel Shub
Daniel Shub 2012년 3월 25일
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
Igor de Britto
Igor de Britto 2012년 3월 28일
Thanks, man. Took me a while to understand how to preallocate, but it worked just fine!
Jan
Jan 2012년 3월 28일
@Igor: Do not forget Daniel's suggestion not to use EVAL.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Walter Roberson
Walter Roberson 2012년 3월 25일

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by