Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MatlabOOP与慢速运算符重载_Oop_Matlab_Optimization - Fatal编程技术网

MatlabOOP与慢速运算符重载

MatlabOOP与慢速运算符重载,oop,matlab,optimization,Oop,Matlab,Optimization,是否可以从下面的简单类中获得3-6倍的加速 我试图创建一个类,它假装是一个内联函数,但是括号/subsref操作符重载对我来说不够快 我创建了类CTestOp来替换内联函数f=@(x)A*x,方法是让subsref获取一个向量,并将其与类属性A相乘 基准测试表明,对于较小的A和x(例如,m=5),使用内联函数所需的时间是只写A*x所需的时间的4-7倍,使用类所需的时间是使用内联函数所需的时间的4-7倍: Elapsed time is 0.327328 seconds for the class

是否可以从下面的简单类中获得3-6倍的加速

我试图创建一个类,它假装是一个内联函数,但是括号/subsref操作符重载对我来说不够快

我创建了类
CTestOp
来替换内联函数
f=@(x)A*x
,方法是让subsref获取一个向量,并将其与类属性
A
相乘

基准测试表明,对于较小的
A
x
(例如,m=5),使用内联函数所需的时间是只写
A*x
所需的时间的4-7倍,使用类所需的时间是使用内联函数所需的时间的4-7倍:

Elapsed time is 0.327328 seconds for the class
Elapsed time is 0.053322 seconds for the inline function.
Elapsed time is 0.011704 seconds for just writing A*x.
我已经做了一系列的改进来达到这一点,但也存在一些问题。例如,我可以通过不要求
this.A
而看到实质性的收益,但这违背了整个目的。我本想使用一个抽象类,它允许我们编写各种
操作
函数——但是,虽然使类抽象并没有增加多少时间,但实际的函数调用却增加了时间

有什么想法吗

课程为:

classdef CTestOp < handle

    properties     
        A = [];
    end

    methods
        function this = CTestOp(A)
            this.A = A;
        end

        function result = operation(this, x)
            result = this.A*x;
        end

        function result = subsref(this, S)

%             switch S.type
%                 case '()'
                    %   result = this.operation(S.subs{1});  % Killed because this was really slow
                    %   result = operation(this, S.subs{1}); % I wanted this, but it was too slow
                    result = this.A*S.subs{1};
%                 otherwise
%                     result = builtin('subsref', this, S);
%             end

        end
    end

end

如果您想在Matlab中编写快速代码,诀窍总是将代码矢量化。 使用MatlabOO也是如此。虽然我目前无法测试它,但我很有信心,您可以通过执行一个大操作而不是许多小操作来减少开销

在您的特定示例中,您可以再次运行基准测试,并通过更改以下两行来查看我的语句是否有效:

m = 500; % Work with one big matrix rather than many tiny ones

nc = 99; % Just some number that should give you reasonable run times

如果您想在Matlab中编写快速代码,诀窍总是将代码矢量化。 使用MatlabOO也是如此。虽然我目前无法测试它,但我很有信心,您可以通过执行一个大操作而不是许多小操作来减少开销

在您的特定示例中,您可以再次运行基准测试,并通过更改以下两行来查看我的语句是否有效:

m = 500; % Work with one big matrix rather than many tiny ones

nc = 99; % Just some number that should give you reasonable run times

我确信性能和OO在Matlab中是互斥的。如果您还没有这样做,请查看本文。@slayton:OOP与Matlab的其他部分一样:避免大量不必要的函数/方法调用。在MATLAB中做OOP,就像你在java或C++中所做的(即很多有很多小方法的调用的类)效率不高。@ Navan是完全正确的,特别是注意到你使用的是点引用方法调用,调用比函数调用风格调用慢。(也就是说,您使用的是obj.method()而不是method(obj)-在内部,对于第一种样式,MATLAB首先必须检查您是否打算为obj编制索引,而不是对其调用函数(是的,即使您将paren放在了那里)。我确信性能和OO在Matlab中是互斥的。如果您还没有这样做,请查看本文。@slayton:OOP与Matlab的其他部分一样:避免大量不必要的函数/方法调用。在MATLAB中做OOP,就像你在java或C++中所做的(即很多有很多小方法的调用的类)效率不高。@ Navan是完全正确的,特别是注意到你使用的是点引用方法调用,调用比函数调用风格调用慢。(也就是说,您使用的是obj.method()而不是method(obj)-在内部,对于第一种样式,MATLAB首先必须检查您是否打算为obj编制索引,而不是对其调用函数(是的,即使您将paren放在那里)。在这种情况下,我选择了一个小维度来隔离和测量开销。的确,我们可以减少花费在开销上的时间百分比,但我们希望消除实际开销,而不仅仅是说它无关紧要。@Steve这是正确的,但是,如果您的大矩阵包含所有这些小矩阵的信息,那么也可以减少总开销(毫秒)。在这种情况下,我选择了一个小维度来隔离和测量开销。的确,我们可以减少花费在开销上的时间百分比,但我们希望消除实际开销,而不仅仅是说它无关紧要。@Steve这是正确的,但是如果你的大矩阵包含所有这些小矩阵的信息,那么也可以减少总开销(毫秒)。