问题标签 [matlab-class]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - How do properties work in Object Oriented MATLAB?
I am trying to create a MATLAB class with a member variable that's being updated as a result of a method invocation, but when I try to change the property within the class it (apperently, from what I understood from MATLAB's memory management) creates a copy of the object and then modifies it, leaving the original object's property untouched.
.
matlab - 如何修改 Matlab 对象的属性
我创建了一个 MATLAB 类,例如:
问题是,当我调用该函数时,该属性x_array
永远不会被修改increment()
:例如:
我做了一些研究,得出的结论是,这是因为 MATLAB 对对象使用了延迟复制,让我的类继承 HANDLE 类应该可以解决这个问题,但是没有,有人知道为什么会这样吗?如果扩展句柄类是独立的解决方案,这不是正确的方法吗:
还是有任何额外的步骤?
matlab - 为什么我的 MATLAB (R2008a) 对象的类在保存/加载周期中发生变化?
更新: 这是一个已知的错误- 链接需要登录到 Mathworks 才能访问它。
错误报告摘要
如果使用版本 7.6 (R2008a) 保存到 MAT 文件中的 MATLAB 用户定义类的其中一个属性值是不同 MATLAB 类的实例,则该实例可能无法正确加载。
简而言之,Mathworks 报告以前保存的顶级自定义对象可能加载不正确(如下所述),并且错误发生在 SAVE 步骤中。因此,MAT 文件中的数据已损坏。
根据我的经验,这似乎是断断续续的。在一个数据分析应用程序中,我写了 75 个 MAT 文件,其中 37 个保存了这种损坏:(
小心用户定义的对象。我在保存时添加了以下测试以确保数据没有损坏
原始问题
这里我使用的是 MATLAB 2008a。这个微妙的错误已在 MATLAB-2009a 中修复。无论如何,我的两个类的定义方式,保存/加载循环导致一个类(superClass)的变量被加载为我的第二个类(propClass)的变量。
示例 MATLAB (r2008a) 会话
加载 matlab.mat 后,变量bb神秘地从 superClass 变为 propClass
类:超类
这个类需要包含一个 propClass 类型的数组,这是它的朴素定义
类:道具类
PropClass 是超类使用的第二个类。它的定义对于这个错误并不重要。
问题
那么,为什么在MATLAB-R2008a中加载操作后superClass被改为propClass呢?其次,如何更改superClass的定义以避免这种症状?
笔记
我在我写的一个更大的课程中遇到了这个症状,并缩小了问题的根源。我知道它发生在上面描述的 MATLAB 会话中,但似乎如果我将一个对象添加到 superClass 的属性数组中,那么问题就会消失。所以,如果我在保存之前调用 superClass.addProp,那么从superClass到propClass的奇怪变化就不会发生。
matlab - 对象数组方法调度
在 MATLAB 的新对象模型中(classdef
等):如果我有一个对象数组,并且我调用一个普通方法,是为每个对象调用的方法,还是为整个数组调用的方法,即传入方法的单个对象,还是整个数组?我知道在旧模型中,它是作为整个数组发送的。
matlab - 如何在 MATLAB 中创建枚举类型?
MATLAB中有枚举类型吗?如果没有,有什么替代方案?
matlab - Matlab 多态性
我有两个新型 MATLAB 类 - B
& C
,它们都是抽象父类的具体子类,A
. A
是hgsetset
(句柄类)的子类。我想将它们放在 MATLAB 中的一个数组中,并将它们都视为A
s. 它们大致定义为:
但是,如果我这样做:
MATLAB 会告诉B
我A
两者foo
都是b
.
但是,如果我颠倒顺序:
它告诉我两者都是 type C
,如果我尝试在两者上执行 foo ,它会执行,本质上是c
.
任何想法如何以多态方式使用子类?
我知道我可以将它们放在一个单元阵列中并获得我需要的 90%。但这有点杂乱无章。
matlab - MATLAB OOP 是慢还是我做错了什么?
我正在尝试使用MATLAB OOP,作为开始,我模仿了 C++ 的 Logger 类,并将所有字符串辅助函数放在 String 类中,我认为能够执行类似a + b
, a == b
,a.find( b )
而不是 , 之strcat( a b )
类strcmp( a, b )
的操作会很棒检索strfind( a, b )
等的第一个元素
问题:减速
我使用了上述东西,并立即注意到速度急剧下降。我做错了吗(这当然是可能的,因为我的 MATLAB 经验相当有限),还是 MATLAB 的 OOP 只是引入了很多开销?
我的测试用例
这是我对字符串所做的简单测试,基本上只是附加一个字符串并再次删除附加的部分:
注意:不要在实际代码中编写这样的 String 类!Matlab 现在有一个原生
string
数组类型,你应该使用它。
结果
1000 次迭代的总时间(以秒为单位):
btest 0.550(String.SetLength 0.138,String.plus 0.065,String.Length 0.057)
测试 0.015
记录器系统的结果同样是:frpintf( 1, 'test\n' )
在内部使用 String 类时,对 1000 次调用需要 0.1 秒,对我的系统进行 1000 次调用需要 7(!)秒(好吧,它有更多的逻辑,但要与 C++ 进行比较:我的系统在输出端使用std::string( "blah" )
和std::cout
在输出端与普通的开销std::cout << "blah"
大约为 1 毫秒。)
查找类/包函数时是否只是开销?
由于 MATLAB 被解释,它必须在运行时查找函数/对象的定义。所以我想知道查找类或包函数与路径中的函数相比,可能会涉及更多开销。我试图测试这个,它只是变得陌生。为了排除类/对象的影响,我比较了在路径中调用函数与在包中调用函数:
结果,以与上述相同的方式收集:
在 ctest 中测试 0.004 秒,0.001 秒
btest 0.060 秒,util.ctest 中的 0.014 秒
那么,所有这些开销是否仅来自 MATLAB 花时间查找其 OOP 实现的定义,而直接在路径中的函数则不存在这种开销?
matlab - MATLAB 中的常量
我已经拥有了一堆 MATLAB 代码,并注意到一堆散布在代码中的“神奇数字”。通常,我喜欢用 C、Ruby、PHP 等语言制作这些常量。当谷歌搜索这个问题时,我发现拥有常量的“官方”方式是定义返回常量值的函数。看起来很笨拙,特别是因为当每个文件允许多个函数时,MATLAB 可能会很挑剔。
这真的是最好的选择吗?
我很想使用/制作像 C 预处理器这样的东西来为我做这件事。(我发现一个叫做的东西mpp
是由其他人在类似的困境中制作的,但它看起来被遗弃了。代码无法编译,我不确定它是否能满足我的需求。)
matlab - 如何判断一个句柄对象在matlab中使用了多少内存
如果我将一个对象声明为句柄 classdef obj < 句柄的子类,我的对象现在本质上是指向某处某个内存的“指针”。如何找出我的对象使用了多少内存?
例如,假设我有一个带有字段栏的类 foo
bar 占用 8 兆字节(8 字节 * 100 万个数字)
但如果我输入
我明白了
如何找出 obj 指向的总内存量?
matlab - 组织 MATLAB 类的最佳方式?
MATLAB 有两种组织类的方法:
@-目录:
单个文件:
第一种风格在新classdef
语法之前存在,但似乎是一种更有条理的做事方式。第二种样式(单个文件中的所有内容)是新的。
您使用哪种方法,为什么?