标签: matlab-class

MATLAB OOP运行缓慢还是我做错了什么?

我与实验MATLAB OOP,因为一开始我模仿我的C++的记录器类,我把我所有的字符串辅助函数在String类,以为这将是巨大的,能够做的事情一样a + b,a == b,a.find( b )而不是strcat( a b ),strcmp( a, b ),检索的第一元件strfind( a, b ),等

问题:减速

我把上面的东西用上,并立即注意到一个急剧减速.我做错了(这当然有可能,因为我有相当有限的MATLAB经验),还是MATLAB的OOP只是引入了很多开销?

我的测试用例

这是我为字符串做的简单测试,基本上只是附加一个字符串并再次删除附加部分:

classdef String < handle
  ....
  properties
    stringobj = '';
  end
  function o = plus( o, b )
    o.stringobj = [ o.stringobj b ];
  end
  function n = Length( o )
    n = length( o.stringobj );
  end
  function o = SetLength( o, n ) …
Run Code Online (Sandbox Code Playgroud)

oop benchmarking matlab profiling matlab-class

136
推荐指数
1
解决办法
2万
查看次数

如何在MATLAB中创建枚举类型?

MATLAB中是否有枚举类型?如果没有,有哪些替代方案?

matlab enums matlab-class

44
推荐指数
6
解决办法
4万
查看次数

MATLAB中的常量

我已经掌握了一堆MATLAB代码的所有权,并注意到代码中散布着一堆"神奇的数字".通常,我喜欢用C,Ruby,PHP等语言制作这些常量.当谷歌搜索这个问题时,我发现拥有常量的"官方"方式是定义返回常量值的函数.看起来像kludgey,特别是因为当每个文件允许多个函数时,MATLAB可能很挑剔.

这真的是最好的选择吗?

我很想使用/制作像C预处理器这样的东西来为我做这件事.(我发现所谓的某些东西mpp是由处于类似困境的其他人制作的,但它看起来已经废弃.代码无法编译,我不确定它是否能满足我的需求.)

matlab constants matlab-class

39
推荐指数
3
解决办法
5万
查看次数

属性如何在面向对象的MATLAB中工作?

我正在尝试使用一个成员变量来创建一个MATLAB类,该变量由于方法调用而被更新,但是当我尝试更改类中的属性时(显然,从我从MATLAB的内存管理中理解的)创建一个副本对象然后修改它,保持原始对象的属性不变.

classdef testprop  
    properties  
        numRequests=0;  
    end  
    methods  
        function Request(this, val)  
            disp(val);  
            this.numRequests=this.numRequests+1;  
        end  
    end  
end  
Run Code Online (Sandbox Code Playgroud)

.

>> a=testprop;
>> a.Request(9);
>> a.Request(5);  
>> a.numRequests  

ans = 0  
Run Code Online (Sandbox Code Playgroud)

oop matlab properties matlab-class

26
推荐指数
3
解决办法
2万
查看次数

如何修改Matlab对象的属性

我创建了一个MATLAB类,类似于:

classdef myclass

  properties
      x_array = [];
  end

  methods
    function increment(obj,value)
       obj.x_array = [obj.x_array ; value);
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是,x_array当我调用increment()函数时,属性永远不会被修改:ex:

>>s = myclass
>>increment(s,5)

>>s.x_array
ans = []
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,我得出的结论是,这是因为MATLAB使用了Lazy Copy for objects,使得我的类继承HANDLE类应该已经解决了这个问题,但事实并非如此,有人知道为什么会发生这种情况吗?如果扩展句柄类是解决方案,这不是正确的方法:

classdef myclass < handle
Run Code Online (Sandbox Code Playgroud)

还是有任何额外的步骤?

matlab properties matlab-class

24
推荐指数
1
解决办法
2万
查看次数

组织MATLAB类的最佳方法是什么?

MATLAB有两种组织类的方法:

@ -directories:

@ClassName\
    ClassName.m
    Method1.m
    Method2.m

单个文件:

ClassName.m:
classdef ClassName
    methods
        % all methods included here
    end
end

第一种风格在新classdef语法之前就存在了,但似乎是一种更有条理的做事方式.第二种风格(单个文件中的所有内容)都是新的.

你使用哪种方法,为什么?

oop matlab code-organization organization matlab-class

17
推荐指数
3
解决办法
6531
查看次数

如何判断句柄对象在matlab中使用了多少内存

如果我声明一个对象是句柄classdef的子类obj <handle我的对象现在基本上是某个某处内存的"指针".如何找出对象耗尽的内存量?

例如,假设我有一个带字段栏的类foo

classdef foo < handle 
properties
    bar = randn(1000);
end
Run Code Online (Sandbox Code Playgroud)

bar需要8兆字节(8字节*100万个数字)

但如果我输入

obj = foo();
whos('obj');
Run Code Online (Sandbox Code Playgroud)

我明白了

Name      Size            Bytes  Class    Attributes

  obj      1x1                60  foo                
Run Code Online (Sandbox Code Playgroud)

我如何找出obj指向的总内存量?

matlab class object handle matlab-class

15
推荐指数
1
解决办法
4667
查看次数

如何在MATLAB类中获取静态成员变量?

有没有办法在MATLAB类中定义静态成员变量?

这不起作用:

classdef A

    properties ( Static )
        m = 0;
    end
end
Run Code Online (Sandbox Code Playgroud)

它建议使用关键字"常量"而不是"静态",不能修改常量属性.我想要一个对所有类对象通用的变量A,我希望能够在类的方法中修改该变量A.

所以我需要的是一个私有静态成员变量.有没有办法在MATLAB中获得它?


发现可以使用静态成员函数中的持久变量来完成变通方法.

在这种情况下,您应该从基类继承所有类,如下所示.

classdef object < handle

    properties ( GetAccess = 'public', SetAccess = 'private' )
        id
    end

    methods ( Access = 'protected' )
        function obj = object()
            obj.id = object.increment();
        end
    end

    methods ( Static, Access = 'private' )
        function result = increment()
            persistent stamp;
            if isempty( stamp )
                stamp = 0;
            end
            stamp = stamp + uint32(1); …
Run Code Online (Sandbox Code Playgroud)

oop matlab class static-functions matlab-class

15
推荐指数
2
解决办法
1万
查看次数

迭代向量分配时的Matlab分段错误

我一直在渲染我之前编写的一些matlab代码,在此过程中,matlab由于分段错误而开始崩溃.我将问题缩小为单一类型的计算:分配给多个结构属性.

例如,即使这种形式的自我分配最终会在执行数千次时导致seg错误:

[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;

我最初假设这必须是某种类型的内存泄漏,所以尝试在每次迭代后打印出java的可用内存,但这仍然是相当稳定的.

所以是的,现在完全不知道为什么会破坏: - /

更新:以下更改修复了seg faulting:

temp = [my_class_instance.my_struct_vector];

[temp.my_property] = temp.my_property;

[my_class_instance.my_struct_vector] = temp;

现在的问题是为什么这会解决任何问题.关于重复访问句柄类而不是结构列表的事情可能呢?

更新2:地图更厚

我终于复制了问题,并使用一个简单的虚拟程序来解决这里:

一个简单的类:

classdef test_class
    properties
        test_prop
    end
end
Run Code Online (Sandbox Code Playgroud)

还有一个程序,它会对类进行一系列向量分配,并且总会崩溃.

test_instance = test_class();
test_instance.test_prop = struct('test_field',{1 1});
for i=1:10000

    [test_instance.test_prop.test_field] = test_instance.test_prop.test_field;
end
Run Code Online (Sandbox Code Playgroud)

更新3:剧情薄弱

事实证明我发现了一个错误.根据Matlab技术支持,类属性的重复向量分配根本不适用于R2011a(可能在早期版本中).他告诉我它在R2​​012a中工作正常,然后提到了我发现的相同解决方法:使用临时变量.

是的...

非常肯定这个问题以支持票结束,但如果有任何大胆的人想要为这个错误存在的原因拍摄,我肯定仍然对这样的答案感兴趣.(学习很有趣!)

java debugging matlab segmentation-fault matlab-class

15
推荐指数
1
解决办法
1075
查看次数

索引对象点符号方法给出标量属性

我在使用点符号应用方法后尝试引用对象属性时遇到问题.它只发生在我尝试索引初始对象时

classdef myclassexample

properties
    data
end    

methods   
    function obj = procData(obj)            
        if numel(obj)>1
            for i = 1:numel(obj)
                obj(i) = obj(i).procData;
            end
            return
        end
        %do some processing
        obj.data = abs(obj.data);
    end
end
end
Run Code Online (Sandbox Code Playgroud)

然后分配以下内容

A = myclassexample;
A(1).data= - -1;
A(2).data =  -2;
Run Code Online (Sandbox Code Playgroud)

当调用整个数组并收集属性数据时,它工作正常

[A.procData.data]
Run Code Online (Sandbox Code Playgroud)

如果我尝试索引A然后我只得到一个标量

[A([1 2]).procData.data]
Run Code Online (Sandbox Code Playgroud)

即使没有财产电话似乎没事

B  = A([1 2]).procData;
[B.data]
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

arrays oop syntax matlab matlab-class

14
推荐指数
1
解决办法
787
查看次数