matlab函数参数传递

时间:2013-06-20 09:30:07

标签: matlab function optimization

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

例如:

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

哪个在峰值内存使用率和速度方面会更好?

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

对于你所问的问题,这个问题不是“法律信函”本身所涉及的问题,(如果我做出假设,我会道歉),但就“精神问题”而言。就法律而言,我理解隐含的问题是“将事情写成'丑陋的'单行者赋予任何重要的优化利益”,答案绝对不是。部分原因是由于matlab的懒惰评估,正如上面指出的那样。

所以我更喜欢第二个版本,因为它更具可读性。据我所知,它不会对性能造成任何惩罚。