我发现在 Matlab 中访问属性非常慢。我还没有找到解决方法,但在这里找到了一些基本的想法:http: //blogs.mathworks.com/loren/2012/03/26/considering-performance-in-object-orienting-matlab-code/
但是这篇文章只谈论避免可怕的、糟糕的表现。即使使用最简单的属性,性能也充其量是平庸的。
以 Mathworks 文章中的示例类为例。我做了小测试脚本:
clear all
clc
n = 1e5;
%% OOP way - abysimal
result = zeros(1, n);
tic
for i = 1:n
cyl = SimpleCylinder();
cyl.R = i;
cyl.Height = 10;
result(i) = cyl.volume();
end
toc
%% OOP Vectorized - fair
clear result
tic
cyl = SimpleCylinder();
cyl.R = 1:n;
cyl.Height = 10;
result = cyl.volume();
toc
%% for loop without objects - good
result = zeros(1, n);
tic
for i = 1:n
result(i) = pi .* i.^2 .* 10;
end
toc
%% Vectorized without objects - excellent
clear result
tic
R = 1:n;
result = pi .* R.^2 .* 10;
toc
有了这些结果:
Elapsed time is 6.141445 seconds.
Elapsed time is 0.006245 seconds.
Elapsed time is 0.002116 seconds.
Elapsed time is 0.000478 seconds.
如您所见,每个属性访问都在减慢。尝试向量化(一如既往),但即使是简单的 for 循环也优于小 n 的向量化 OOP 解决方案。(在我的电脑上,他们在 1e7 时收支平衡)
基本信息:Matlab 中的 OOP 很慢!您为每次访问财产付出代价。
对你的问题:当你打电话时
myfun2 (inputvar.var1, inputvar.var2, ... etc )
值被复制。在函数中,您不再处理类。访问变量很快。但是,如果您通过整个类,则每次访问属性都很慢。您可以通过在局部变量中缓存所有属性并使用它们来规避这种情况。
如果您修改类以从句柄继承,一切都会变得更快,但差异可以忽略不计。