【问题标题】:Automating inputs to Matlab自动输入到 Matlab
【发布时间】:2017-09-06 01:25:01
【问题描述】:

我正在帮助今年夏天在 Matlab 课程中评分,其中一项任务包括构建一个简单的用户界面,用于绘制函数并改变它们的外观。所有的输入都是在命令行中完成的,所以菜单看起来像这样:

=====================
1. New function
2. Change line-width
3. Change line-style
=====================

在评分测试基本功能时,我总是以相同的方式开始测试:

1, 2, sin(x)(在窗口 2 中创建 sin(x) 图形)

1, 3, exp(x)(在窗口 3 中创建 exp(x) 的图形)

2, 3, 2(将3号地块的线宽改为2)

3, 2, --(将2号地块的线型改为虚线)

等等

由于大多数提交都遵循相同的建议菜单结构,如果有一种方法可以使用脚本自动完成这些输入,而不是一遍又一遍地重复相同的数字和字母序列,那我的生活会更轻松。脚本本身不必在 Matlab 中,虽然我猜这很实用,因为我需要手动检查结果图(即我需要在 Matlab 命令行中输入输入)。

基本上,我希望 Matlab 在运行另一个 Matlab 脚本时将击键“1 [enter] 2 [enter] sin(x) [enter] ...”读取到命令行。

有什么想法吗?

【问题讨论】:

标签: matlab input


【解决方案1】:

一种可能性是创建一个private 版本的input 函数,它会隐藏内置函数。每次调用它时,它都会从一组预定的值中返回一个值。您可以使用global/persistent 变量(用于跟踪函数被调用次数的计数器)来维护状态。

基本上你会创建一个method stubmock 的真实函数的行为。


这是一个更好地解释我的想法的例子:

/somepath/private/input.m

function ret = input(prompt, varargin)
    %# counter
    persistent count
    if isempty(count), count = 1; end

    %# hard-coded values to return
    values = {
        1 2 'sin(x)' ...
        1 3 'exp(x)' ...
        2 3 2 ...
        3 2 '--' ...
    };

    %# display the prompt message
    disp([prompt '[SIMULATED INPUT #' num2str(count) ']'])

    %# return value
    ret = values{count};

    %# increment counter
    count = count + 1;
    if count>12
        count = 1;
    end
end

/somepath/hw1.m

function hw1
    %# image this is a sample homework file, 
    %# using the standard INPUT function to ask for input from the user
    %# and do something useful with it :)

    num1 = input('enter a number: ');
    num2 = input('enter a second number: ');
    str = input('enter a string: ', 's');
    fprintf('You entered: %d %d %s\n',num1,num2,str);

    num1 = input('enter a number: ');
    num2 = input('enter a second number: ');
    str = input('enter a string: ', 's');
    fprintf('You entered: %d %d %s\n',num1,num2,str);

    num1 = input('enter a number: ');
    num2 = input('enter a second number: ');
    num3 = input('enter a third number: ');
    fprintf('You entered: %d %d %d\n',num1,num2,num3);

    num1 = input('enter a number: ');
    num2 = input('enter a second number: ');
    str = input('enter a string: ', 's');
    fprintf('You entered: %d %d %s\n',num1,num2,str);
end

这是你得到的输出:

enter a number: [SIMULATED INPUT #1]
enter a second number: [SIMULATED INPUT #2]
enter a string: [SIMULATED INPUT #3]
You entered: 1 2 sin(x)
enter a number: [SIMULATED INPUT #4]
enter a second number: [SIMULATED INPUT #5]
enter a string: [SIMULATED INPUT #6]
You entered: 1 3 exp(x)
enter a number: [SIMULATED INPUT #7]
enter a second number: [SIMULATED INPUT #8]
enter a third number: [SIMULATED INPUT #9]
You entered: 2 3 2
enter a number: [SIMULATED INPUT #10]
enter a second number: [SIMULATED INPUT #11]
enter a string: [SIMULATED INPUT #12]
You entered: 3 2 --

【讨论】:

  • 这很聪明!这应该适用于遵循建议的菜单结构的学生。谢谢!
  • @Amro 只是想对炫耀一些非常酷的开箱即用的想法表示敬意!
【解决方案2】:

看看 AutoIt 看看它是否适合您的需求:

http://www.autoitscript.com/site/autoit/

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2017-05-28
    • 2017-05-12
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多