m-files as function inputs in for loop

Hi everyone!
I have a function.m that I run with an input.m like this:
function input
I'm trying to process a Monte Carlo Samples in this function. So I have a lot of m-files inputs: input_1.m, input_2.m, ..., input_n.m.
To process everything I set up this for loop:
for i = 1:n
filename = sprintf('%s_%d', 'input', i);
function filename
end
But the function doesn't recognize the string to run. The errors are:
Error using pdatvp_seq (line 49)
Data file not found: filename.
Error in run_test (line 4)
function filename
Someone knows how to help me to do the function recognize the string to run?

4 个评论

Bad idea creating a file called "function.m". "function" is a reserved MATLAB keyword.
No, I wrote function here only for better identification. My function actually is progcoll.m
What does progcoll look like? I'm not familiar with trying to just pass one .m file in after another like that. Usually you would pass in arguments in parentheses. Also, trying to simplify your question is good, but doing so by replacing real function names with 'function' is very confusing since it is a fundamental key word.
It's a nonlinear structure analysis code. I'm not familiar with this too.
And sorry about the confusion with the names!

请先登录,再进行评论。

 采纳的回答

One obvious problem is that you are using command syntax whereas you need to be using function syntax (note the parentheses!):
for k = 1:n
fname = sprintf('input_%d.m', k);
progcoll(fname)
end
Your original code did not work because with command syntax all trailing strings are interpreted literally, so the trailing filename is not interpreted as a variable containing a name, but instead simply as the string of characters 'filename'. I would recommend that you always use function syntax every time that you call a function. Read about the difference here:
It states "When a function input is a variable, you must use function syntax to pass the value to the function. Command syntax always passes inputs as literal text and cannot pass variable values"

3 个评论

The code isn't mine. I don't even know that I could pass a m-file this way as a parameter of a function. The parentesis didn't work here. I'll think about other solution to solve the problem. Maybe another approach.
But you are right about the syntax, I agree!!! Thank you for your attention :)
"The parentesis didn't work here"
Did the code run? Did you get any warning or error message? (please give the complete message if you did)
I worked more in your solution and I discovered that I put the directories to the wrong path. When I fixed it, your code worked and the process started!!! Thank you so much, I'm trying to solve this for days :)
And sorry if I didn't make myselse clear before, english isn't my first language.

请先登录,再进行评论。

更多回答(1 个)

As a general description, you have a function you want to call in an .m file:
.m
function out = target_fun(in)
...
end
The function can be called, with input and output, by using the eval command
main.m
fun_call = [fun_name, '(' fun_param ')'];
result = eval(fun_call);
For your use you can apply it like this:
for i = 1:n
filename = sprintf('%s_%d', 'input', i);
eval(filename)
end

3 个评论

Do NOT use eval to call a script/function! Using eval is massive overkill for the simple running of a script/function. Also, depending on what objects the compiler matches that string to (or what is contained in the string) there could be all sorts of unpredictable side effects and bugs: using eval is not a robust solution, and will increase the chance of bugs (and makes them harder to locate).
Scripts: If you need to call multiple scripts in a loop then simply use run:
for k = 1:n
name = sprintf('name_%d', k);
run(name)
end
Note that run accepts an absolute/relative path, so those files can be anywhere on your computer/drives (and not just on the MATLAB path).
Functions: If you need to call multiple functions in a loop (optionally with any required input/output arguments) then use str2func:
for k = 1:n
fun = str2func(sprintf('name_%d', k));
[...] = fun(...);
end
PS: calling a script/function still does not answer the question. The problem lies elsewhere!
Kai Domhardt, It didn't work! Only the script of the input run. But thank you for your ideia.
Stephen Cobeldick, thank you for your explanation! I didn't know about this.
I just want to re-iterate:
Do not use eval! Which reminds me of another item I'd like to put in things I would not miss.

请先登录,再进行评论。

类别

Community Treasure Hunt

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

Start Hunting!

Translated by