问题标签 [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.

0 投票
3 回答
15764 浏览

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.

.

0 投票
2 回答
23255 浏览

matlab - 如何修改 Matlab 对象的属性

我创建了一个 MATLAB 类,例如:

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

我做了一些研究,得出的结论是,这是因为 MATLAB 对对象使用了延迟复制,让我的类继承 HANDLE 类应该可以解决这个问题,但是没有,有人知道为什么会这样吗?如果扩展句柄类是独立的解决方案,这不是正确的方法吗:

还是有任何额外的步骤?

0 投票
1 回答
1328 浏览

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,那么从superClasspropClass的奇怪变化就不会发生。

0 投票
2 回答
483 浏览

matlab - 对象数组方法调度

在 MATLAB 的新对象模型中(classdef等):如果我有一个对象数组,并且我调用一个普通方法,是为每个对象调用的方法,还是为整个数组调用的方法,即传入方法的单个对象,还是整个数组?我知道在旧模型中,它是作为整个数组发送的。

0 投票
10 回答
40093 浏览

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

MATLAB中有枚举类型吗?如果没有,有什么替代方案?

0 投票
2 回答
8168 浏览

matlab - Matlab 多态性

我有两个新型 MATLAB 类 - B& C,它们都是抽象父类的具体子类,A. Ahgsetset(句柄类)的子类。我想将它们放在 MATLAB 中的一个数组中,并将它们都视为As. 它们大致定义为:

但是,如果我这样做:

MATLAB 会告诉BA两者foo都是b.

但是,如果我颠倒顺序:

它告诉我两者都是 type C,如果我尝试在两者上执行 foo ,它会执行,本质上是c.

任何想法如何以多态方式使用子类?

我知道我可以将它们放在一个单元阵列中并获得我需要的 90%。但这有点杂乱无章。

0 投票
4 回答
28613 浏览

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 实现的定义,而直接在路径中的函数则不存在这种开销?

0 投票
8 回答
53854 浏览

matlab - MATLAB 中的常量

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

这真的是最好的选择吗?

我很想使用/制作像 C 预处理器这样的东西来为我做这件事。(我发现一个叫做的东西mpp是由其他人在类似的困境中制作的,但它看起来被遗弃了。代码无法编译,我不确定它是否能满足我的需求。)

0 投票
2 回答
4968 浏览

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

如果我将一个对象声明为句柄 classdef obj < 句柄的子类,我的对象现在本质上是指向某处某个内存的“指针”。如何找出我的对象使用了多少内存?

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

bar 占用 8 兆字节(8 字节 * 100 万个数字)

但如果我输入

我明白了

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

0 投票
4 回答
6904 浏览

matlab - 组织 MATLAB 类的最佳方式?

MATLAB 有两种组织类的方法:

@-目录:

单个文件:

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

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