【问题标题】:Creating Continuous Output in Matlab在 Matlab 中创建连续输出
【发布时间】:2017-04-29 23:56:14
【问题描述】:

我有一个类似这样的脚本:

i = 1;
while i <10000
   a = input('enter a ');
   c(i) = a;
   i = i + 1;

end

无论用户输入值需要多长时间或循环中发生的任何其他事情,我都试图大约每秒将“a”保存在“c”中。例如,假设用户为“a”输入 3 等待 2 秒,然后为“a”输入 6,然后等待 3 秒,然后输入 12,然后暂时没有输入,“c”将如下所示:

c = 3 3 6 6 6 12 12 12 12 12...

现在,'c' 看起来像这样:

c = 3 6 12...

这不是我想要的。有什么建议么?它不必是一秒钟,但我想要连续输出。

【问题讨论】:

  • 我现在不在电脑前,所以我还不能展示一个实现,但是你可以运行一个后台线程,每秒将a 的当前值捕获到一个数组中。只要后台线程还活着,主线程就会一遍又一遍地获取用户输入。如果用户输入的值太快,其中一些可能会从结果中删除。
  • 这听起来像是一个可行的解决方案。如果您有机会可以发布示例,我将不胜感激。
  • 当然。澄清一下,根据您对已删除答案的评论,input 是检测器读数的替代品?这很重要,因为那时我可能会考虑交换线程(即在主线程中进行计算)。从后台线程读取用户输入可能有问题,但可能没有读取传感器。
  • 同时,这是我在整理一些细节时发现的一篇文章:undocumentedmatlab.com/blog/…。原来你需要多处理工具箱或 Java。哪一个最适合您?我只是非常熟悉 java 方法,但我可以根据文档非常有效地组合一个 mpt 答案。
  • @madphysicist 输入是传感器数据和大约 50 行方程和语句的替代。我有并行处理工具箱,所以我认为这会更好

标签: matlab loops timing


【解决方案1】:

您的问题很有趣,但没有很好地说明。我假设如下:

  • 每个输入应立即附加c,并重复每秒再次附加,直到输入一个新值,这会重置时间计数。从您的问题中不清楚您是否希望将新输入的初始、固定“提交”到c
  • 根据您对现已删除的问题的评论,您希望更新后的c自动显示您应该在一开始就在问题中说明这一点

然后,您可以使用 timer 对象,该对象在输入每个新输入值时停止并重新启动。定时器配置为每秒唤醒一次。当它唤醒时,它将最新的输入值a 附加到向量c 并显示它。不再需要时,应注意停止和删除计时器。此外,

  • 我正在考虑将空输入作为退出信号;也就是说,空输入表示即使迭代尚未用尽,用户也希望完成。使用 Ctrl-C 中止输入是不可行的,因为计时器会继续运行。我不知道如何拦截 Ctrl-C.

  • 我正在从输入函数 input 中删除提示字符串,因为它会干扰更新后的 c 向量的自动显示。

  • 用户输入阻止程序执行。如果您希望在定时器更新时使用c 完成其他操作,请将它们包含在其'TimerFcn' 函数中。目前该函数只是'c = [c a]; disp(c)'(附加输入并显示它)。

代码

c = []; % initiallize
t = timer('ExecutionMode', 'fixedRate', ... % Work periodically
    'Period', 1, ... % Every 1 second...
    'TimerFcn', 'c = [c a]; disp(c)', ... % ... append latest value to c
    'ErrorFcn', 'delete(t)'); % If user ends with Ctrl-C, delete the timer
i = 1;
done = false;
clc % clear screen
while i < 10 & ~done
    a = input(''); % Input new value. No prompt string
    stop(t) % stop appending previous a
    if isempty(a)
        done = true; % no more iterations will not be run
    else
        start(t) % start timer: appends current a, and repeats every second
    end
    i = i + 1;
end
delete(t) % stop and delete timer
clear t % remove timer from workspace

示例

这是一个带有示例运行的 gif,其中我输入值 10203040,具有不同的暂停时间,并以空输入退出。

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多