【问题标题】:Matlab function argument passingMatlab函数参数传递
【发布时间】:2013-06-17 02:28:06
【问题描述】:

根据其他函数的输出指定函数调用中的输入参数是否会影响性能? 峰值内存使用会受到影响吗? 如果我使用临时变量并在计算完每个中间步骤后清除它们会更好吗?

例如:

g=imfill(imclearborder(imdilate(Inp_img,strel('square',5))),'holes');

temp1=imdilate(Inp_img,strel('square',5));
temp1=imclearborder(temp1);
g=imfill(temp1,'holes');
clear temp1

就峰值内存使用率和速度而言,哪个更好?

【问题讨论】:

  • 据我所知,使用函数调用只是使用被清除的隐藏临时变量。有人可能有一些更深入的知识。您可以尝试两种方法并使用profiler 来查找,如果有任何差异,请告诉我们!
  • 我希望这两种解决方案都同样占用内存,除非 JIT 区分这两种解决方案。此外,如果您打算重用temp1,则应首选第二种方法(同样,除非 JIT '缓存'中间结果以供进一步计算)。如果您使用的是 Windows,请在打开任务管理器并检查内存使用情况下尝试这两种解决方案。

标签: matlab function optimization


【解决方案1】:

这不是对您就“法律条文”“本身”提出的问题的回答(如果我做出假设,请致歉),但就“法律精神”而言就法律'而言,我理解隐含的问题是“将事物写成'丑陋'的单行代码是否会带来任何显着的优化收益”,答案绝对是否定的。部分原因是 matlab 的惰性评估,正如上面 rody 指出的那样。

所以我更喜欢第二个版本,只是因为它更具可读性。据我所知,它不会对性能产生任何影响。

【讨论】:

    【解决方案2】:

    这真的取决于。

    从我的头顶(意思是,我可能是错的):

    MATLAB 使用惰性写入时复制方案进行变量赋值。也就是说,

    a = rand(5);
    b = a; 
    

    不会创建a 的显式副本。本质上,b 只是一个参考。但是,当您发出

    b(2) = 4;
    

    a 的全部内容将被复制到一个新变量中,b 指向的位置更改为该新副本,并写入新内容 (4)。

    传递参数也是如此。如果你发出

    c = myFcn(a, b);
    

    myFcn读取来自ab 的数据,这些变量永远不会显式复制到函数的工作区。但是,如果它写入(或以其他方式进行更改)到ab,它们的内容将被复制。

    因此,在您的特定情况下,我认为

    的峰值内存
    r = myFcn( [some computation] )
    

    将等于或小于

    T = [some computation];
    r = myFcn( T );
    clear T;
    

    如果myFcn 没有对T 进行任何更改,则根本不会有任何区别(除了您的更多麻烦和忘记clear 的风险)。

    但是,如果myFcn 更改 T,则会进行深层复制,因此有一段时间T 将在内存中两次。

    找出答案的最好方法是记住记忆来分析:

    profile -memory 
    

    【讨论】:

    • Matlab 不会将像[some computation] 这样的中间计算结果分配给ansans 变量只有在整个语句(而不仅仅是语句中的某个表达式)返回一个值但没有显式分配给变量时才会更新。基本上,如果省略分号就不会打印出来,它就不会更新ans
    • @AndrewJanke:谢谢,我对细节有点模糊。已编辑!
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2012-05-23
    相关资源
    最近更新 更多