【问题标题】:Specify which lines that should be executed in Matlab指定应该在 Matlab 中执行的行
【发布时间】:2014-08-12 14:24:39
【问题描述】:

我在一个 .m 文件中有大约 400 行代码。这个文件被执行了很多次,所以它是程序中最大的时间消耗者。有时当我执行程序时,我只需要运行 400 行中的大约 50 行(50 行中的哪一行将在执行开始时确定)。我希望能够指定应该运行哪些行(或者在应该丢弃的行上自动获得相当于“%-comment”的行),而不使用任何会带来时间开销的 if 语句或类似语句。有没有可能做到这一点?

【问题讨论】:

  • 你分析过代码吗? Matlab 内置了一个非常好的配置文件。在调用 .m 文件中的内容之前添加profile on,最后添加profile viewer。您可能会看到这些 if 语句在脚本的完整运行中只需要
  • 不看代码,你可以冒险说你需要修改你的代码设计。您很可能需要将脚本拆分为函数。
  • @fixitinthemix 它高度依赖于您的代码。你可以阅读一些设计模式/想法here
  • "在每一行添加一个 if 语句" 为什么要在每一行添加 if?使用if 覆盖大量代码。如果这不可能,那么这意味着您要运行的那 50 行分布在整个 .m 文件中,但是您会花更多时间将剩余的 350 行注释掉,然后您将花在运行整个事情上。
  • 此外,即使您在每一行添加了if,这也不会比运行该行本身慢。 if 语句只会计算一个逻辑变量,即truefalse。这比您在这些线上可能拥有的任何其他东西都要快。定义一个逻辑变量skip,在程序开头设置为false,需要的地方加上if (~skip)。这应该很快。

标签: performance matlab optimization


【解决方案1】:

假设您有要执行很多次的行,您可以通过将它们写入单独的函数来节省一些时间。

你可以这样做:

  1. 创建包含所有行的函数(称为 full.m)
  2. 确定您需要哪些行,将其放入矢量v
  3. 将 full.m 导入为名为 full 的元胞数组,(您可以右键单击它并进行导入,您还可以在此处创建一个脚本来自动执行此操作)
  4. 将其写入一个名为 reduce 的文件中:

可以这样写:

dlmwrite('reduced.m',vertcat(full{v}),'')

【讨论】:

  • 请注意,如果你需要这个,你可能会使用一个相当笨拙的设计,但是如果不看任何代码就很难判断。
  • 干净又不错的解决方案。谢谢!
【解决方案2】:

这就是你要找的吗?

s = (1+1==2);

fin = fopen('foo.m','r');
fout = fopen('foo_edit.m','w+');
if s
    while (~feof(fin))
        tline = fgetl(fin);
        if (~isempty(regexp(tline, '^[^(% )].*\% conditional$', 'once')))
            fprintf(fout, '%% %s\n', tline);
        else
            fprintf(fout, '%s\n', tline);
        end
    end
else
    while (~feof(fin))
        tline = fgetl(fin);
        if (~isempty(regexp(tline, '^% .*\% conditional$', 'once')))
            fprintf(fout, '%s\n', tline(3:end));
        else
            fprintf(fout, '%s\n', tline);
        end
    end
end
fclose(fin);
fclose(fout);
delete foo.m
movefile('foo_edit.m', 'foo.m')
foo(5)

让 Matlab 为您制作 cmets。

....这是foo.m

function y = foo (x)
x = x*5;
% x = x+1; % conditional
x = x+20;
% x = x*2; % conditional
y = x;
end

【讨论】:

  • 是的,这基本上正是我想要的,但另一个答案可能更简洁一些,所以我接受了。
【解决方案3】:

if-statement 可能是最快的可能性,使用它。您也可以将文件作为文本文件读取,然后使用eval 运行您希望的部分。未经测试,我确信if-statement 更快或具有相同的速度,使用eval 通常会破坏 JIT-Compiler。

【讨论】:

  • 感谢您的回答。这些行的执行时间与执行 if 语句的时间大致相同,因此在必须执行所有 400 行时,在每行添加一个 if 语句将使运行时间增加一倍。
  • 好的,那我把你的问题搞错了。我认为您有一些通常会执行的部分,您只需添加一个或一些 if 语句,但不是每行一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2012-08-01
  • 2011-06-01
  • 2016-08-24
相关资源
最近更新 更多