Matlab 如何让脚本为输入提示提供值?
我有一组较小的脚本Matlab 如何让脚本为输入提示提供值?,matlab,Matlab,我有一组较小的脚本foo1,foo2,等等,还有一个脚本master.m,可以运行它们,如下所示: % master.m run foo1 run foo2 让我们假设foo1通过说a=input('gimmeanumber\n')在某处调用输入 我认为,如果我在run命令后将所需的值放在新行上,它们将作为输入输入,但它们不是。我还尝试将它们作为字符串封装,即'5'。那也不行 它们是我应该使用的另一个功能吗?我查看了输入的帮助文件,但没有输出功能。大概在某个地方有类似于write或writ
foo1
,foo2
,等等,还有一个脚本master.m
,可以运行它们,如下所示:
% master.m
run foo1
run foo2
让我们假设foo1
通过说a=input('gimmeanumber\n')在某处调用输入代码>
我认为,如果我在run
命令后将所需的值放在新行上,它们将作为输入输入,但它们不是。我还尝试将它们作为字符串封装,即'5'
。那也不行
它们是我应该使用的另一个功能吗?我查看了输入
的帮助文件,但没有输出
功能。大概在某个地方有类似于write
或writetostdio
的东西
如何在不触碰键盘的情况下为另一个脚本调用的脚本提供用户输入?我可以将要输入的值放入master.m
文件中吗
编辑:
因为有点混乱,我会尽力澄清的
脚本foo1
和foo2
不会来回传递值。每个脚本都将独立运行。相反,我试图测试一个程序的一系列用户行为(即通过foo1
中的input
对提示的响应)。这些通常是在键盘上键入的,但我希望我的master.m
文件告诉foo1
用户输入的内容
很抱歉,这让人困惑,但希望这能澄清问题。好的,这有点难看。。。但是如果出于某种原因,foo1.m
等必须保留为脚本,那么这可能是一个解决办法
想法是用新定义的函数myInput
替换input
的每个实例,该函数检查是否在基本工作空间中设置了变量PROMPT\u值
;如果是,则返回,否则传递到内置的输入。例如:
% myInput.m
function [ valueOut ] = myInput( promptString )
W = evalin('caller','whos'); %or 'base'
doesPVexist = ismember('PROMPT_VALUE',[W(:).name]);
if doesPVexist
valueOut = evalin('caller', 'PROMPT_VALUE');
else
valueOut = input(promptString);
end
end
假设我们有以下子脚本:
% foo1.m
a = myInput('Number to double: ');
disp(2*a);
% foo2.m
b = myInput('Number to halve: ');
disp(b/2);
我们可以按如下方式测试该方法:
% master.m
clearvars;
PROMPT_VALUE=5;
run foo1.m;
PROMPT_VALUE=3;
run foo2.m
如果按原样运行,则会将提示_值作为每个下标的输入(返回10和1.5)。如果这些行被注释掉,它将查找来自用户的输入。修改现有代码以适应手动输入和测试输入是微不足道的:
function foo1(niterations)
if nargin == 0
niterations = round(input('How many iterations? '));
end
for ii = 1:numel(niterations)
% Run the thing
fprintf('Running some random program with %d iterations! Yay!\n', niterations(ii));
end
end
使用这种方法,我们可以做到:
>> foo1
How many iterations? 2
Running some random program with 2 iterations! Yay!
或
或
这比尝试从文本文件中导入内容、使用evalin
将内容导入工作区,或者以这种方式使用脚本所需的任何自动方法更符合逻辑。使用。函数定义了输入和输出,这是它们的目的。脚本不会。懒惰不是寻找糟糕编程解决方案的借口。这是在要求一个糟糕的编程解决方案。使用函数并不禁止运行一件事,并在早上回来查看结果。将脚本转换为函数在这里没有意义。他想运行一个测试脚本,该脚本运行另一个请求用户输入的脚本。在生产中,脚本总是要求输入来自键盘,因此将其作为接受参数的函数是没有意义的。然而,出于测试目的,他希望自动运行它,提供输入,这样他就可以测试一组输入值。因此,再次强调,将脚本转换为函数的建议没有意义。@SembeiNorimaki您从该前提得出的结论是荒谬的。一个定义良好的函数从包装器中获取输入,提示用户输入,这比任何试图通过管道传递值的笨拙解决方案更有意义,因为这也适应了批处理/自动调用。他想从一个脚本中获取输出,并将其用作另一个脚本的输入。在foo1
没有输入的情况下,您不能从master
提供输入,因为从master
提供值是输入的全部要点。这是一种变通方法,但在任何情况下都不是一种有用的变通方法。有用的解决办法是以不同的方式来做。@Sembei请记住,SO不仅仅是为了帮助特定的询问者,它还意味着作为编程的知识库。有人可能会认为,从长远来看,停止传播有害的编程做法对公众更有帮助。通常,“我如何做愚蠢的事情Y来解X?”的正确答案是“做不愚蠢的事情Z”。同意,更多的是使用语气。如果有人问了一个完全正确的问题,回答是:“你很懒,你的编程风格很烂,这是我的聪明答案”,那么OP可能不会学到很多东西,也不会再问了。
>> foo1(2)
Running some random program with 2 iterations! Yay!
>> foo1([1, 3, 5, 7, 9])
Running some random program with 1 iterations! Yay!
Running some random program with 3 iterations! Yay!
Running some random program with 5 iterations! Yay!
Running some random program with 7 iterations! Yay!
Running some random program with 9 iterations! Yay!