我与实验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) 我已经掌握了一堆MATLAB代码的所有权,并注意到代码中散布着一堆"神奇的数字".通常,我喜欢用C,Ruby,PHP等语言制作这些常量.当谷歌搜索这个问题时,我发现拥有常量的"官方"方式是定义返回常量值的函数.看起来像kludgey,特别是因为当每个文件允许多个函数时,MATLAB可能很挑剔.
这真的是最好的选择吗?
我很想使用/制作像C预处理器这样的东西来为我做这件事.(我发现所谓的某些东西mpp是由处于类似困境的其他人制作的,但它看起来已经废弃.代码无法编译,我不确定它是否能满足我的需求.)
我正在尝试使用一个成员变量来创建一个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) 我创建了一个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有两种组织类的方法:
@ -directories:
@ClassName\
ClassName.m
Method1.m
Method2.m
单个文件:
ClassName.m:
classdef ClassName
methods
% all methods included here
end
end
第一种风格在新classdef语法之前就存在了,但似乎是一种更有条理的做事方式.第二种风格(单个文件中的所有内容)都是新的.
你使用哪种方法,为什么?
如果我声明一个对象是句柄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类中定义静态成员变量?
这不起作用:
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) 我一直在渲染我之前编写的一些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(可能在早期版本中).他告诉我它在R2012a中工作正常,然后提到了我发现的相同解决方法:使用临时变量.
是的...
非常肯定这个问题以支持票结束,但如果有任何大胆的人想要为这个错误存在的原因拍摄,我肯定仍然对这样的答案感兴趣.(学习很有趣!)
我在使用点符号应用方法后尝试引用对象属性时遇到问题.它只发生在我尝试索引初始对象时
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)
有任何想法吗?
matlab ×10
matlab-class ×10
oop ×5
class ×2
properties ×2
arrays ×1
benchmarking ×1
constants ×1
debugging ×1
enums ×1
handle ×1
java ×1
object ×1
organization ×1
profiling ×1
syntax ×1