【问题标题】:display variable value each n iterations with condition outside the loop在循环外显示每 n 次迭代的变量值
【发布时间】:2016-11-08 07:25:27
【问题描述】:

当我必须在 for 循环的每 n 次迭代中显示变量值时,我总是会按照以下方式做一些事情:

for ii=1:1000
  if mod(ii,100)==0 
     display(num2str(ii))
  end
end

我想知道是否有办法将if 条件移到循环之外以加快代码速度。或者,如果我可以做一些不同的事情。

【问题讨论】:

  • 为什么不使用display(ii),而不先将其转换为字符串?这可能会为您节省一些时间
  • 真的。我通常这样做是为了避免输出格式为ii= \n ii
  • 你应该使用disp(ii)
  • 谢谢。不知道disp

标签: matlab if-statement for-loop


【解决方案1】:

您可以使用嵌套循环:

N = 1000;
n = 100;
for ii = n:n:N
    for k = ii-n+1:ii-1
        thingsToDo(k);
    end
    disp(ii)
    thingsToDo(ii);
end

其中thingsToDo() 获取相关计数器(如果需要)。这有点乱,但可以节省很多if的测试。

【讨论】:

  • 酷!我从来没有想过这个。但是我尝试了您的代码(在评论 thingsToDo(k) 之后),它在 0.005532 秒内运行。我的代码在 0.003336 秒内运行。我不明白为什么。乍一看,我认为您的解决方案更快
  • @shamalaia 我试过了,两种方式都运行了 100 次,嵌套的速度在 0.3 毫秒内明显更快(p=0.006,但这不是真正有效的统计测试)。我不确定是否值得更改代码,这取决于循环中有多少次迭代。
【解决方案2】:

除非测试值的数量远大于打印值的数量,否则我不会责怪 if 语句。一开始可能看起来不是这样,但打印确实是一项相当复杂的任务。需要转换变量并将其发送到输出流,然后在终端中打印。如果您需要加快代码速度,请减少打印数据量。

通常,Matlab 函数也接受向量输入。 dispdisplay 就是这种情况,并且只需要一个函数调用。此外,在打印之前无需转换为字符串。 Matlab 无论如何都应该将数据发送到某种流(这可能确实需要char 类型的参数,但这与 Matlab 使用的字符不同),所以这可能只是浪费时间。除此之外,num2str 还做了很多事情来确保类型安全的转换。你已经知道display 是类型安全的,所以所有这些检查都是多余的。

试试这个,

q = (1:1000)'; % assuming q is some real data in your case
disp(q(mod(q,100)==0)) % this requires a single call to disp

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 2021-05-30
    • 2017-02-09
    • 2018-05-23
    • 2020-01-05
    • 2017-01-15
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    相关资源
    最近更新 更多