是否可以从MATLAB内置类型派生类?

是否可以从MATLAB内置类型派生类?,matlab,Matlab,我正在试验创建只读矩阵类型的想法,该类型可以传递到现有代码中,并与任何其他矩阵一样使用,但禁止分配到子范围: >> x = ReadOnlyMatrix(...); % pass in a regular matrix to construct it >> y = x * 3; % x can be used like any other matrix >> x(1,:) = 0; % error! x is read-only 我找不到任何从“doub

我正在试验创建只读矩阵类型的想法,该类型可以传递到现有代码中,并与任何其他矩阵一样使用,但禁止分配到子范围:

>> x = ReadOnlyMatrix(...);  % pass in a regular matrix to construct it
>> y = x * 3;  % x can be used like any other matrix
>> x(1,:) = 0; % error! x is read-only

我找不到任何从“double”类派生的工作示例或文档。有人能提供一个小例子吗?

正如我在评论中所说的,我对matlab类不是很熟悉。然而,我还是设法解决你的问题。正如我在一篇评论中所问的,我将再次问:为什么不尝试从double派生一个类,就像从任何其他类派生一样(并重写@rayryeng建议的一些方法)

以下是我的想法:

classdef myDouble < double
   methods
       function x = myDouble(inval)
           if nargin == 0
               inval = nan;
           end
           x@double(inval);
       end

       function varargout = subsasgn(varargin)
           error('Type myDouble does not support indexing on the lhs!');
       end
   end
end
正在使用数组初始化:

>> myvar = myDouble(magic(3))

myvar = 

  myDouble

  double data:
     8     1     6
     3     5     7
     4     9     2

  Methods, Superclasses
将阵列用作矩阵:

>> myvar.^2

ans =

    64     1    36
     9    25    49
    16    81     4

>> diag(myvar)

ans =

     8
     5
     2
您可以看到,在
double
超类中定义的所有操作和方法似乎都可以工作,但返回类
double
的对象(这既可以理解又有用)

我们还可以访问子阵列:

>> myvar(2,:)

ans = 

  myDouble

  double data:
     3     5     7

  Methods, Superclasses
它将返回相同类型的对象

因此,让我们尝试覆盖一些元素:

>> myvar(2,2) = 3
Error using myDouble/subsasgn (line 11)
Type myDouble does not support indexing on the lhs!

>> myvar(2,:) = [3; 2]
Error using myDouble/subsasgn (line 11)
Type myDouble does not support indexing on the lhs!

>> myvar  %make sure it's intact '

myvar = 

  myDouble

  double data:
     8     1     6
     3     5     7
     4     9     2

  Methods, Superclasses
被重写的
subsasgn
方法做了它应该做的事情:它抛出一个错误,不管输入是否是带有
double
数组的有效赋值(在后一个示例中:它不会)

我还加入了一个基本的
disp
方法,使我们的类更加隐蔽:

       function disp(obj)
           disp(double(obj));
       end
结果输出与实际的
双精度

>> magic(3)

ans =

     8     1     6
     3     5     7
     4     9     2

>> myDouble(magic(3))

ans = 

     8     1     6
     3     5     7
     4     9     2

您是否尝试过从定制类派生?或者在这方面有什么障碍(你可能会说我不太熟悉matlab类,但我很感兴趣)。你可以创建一个自定义类,但是重写subsref方法,这样它要么抛出一个错误,注意:我的理解是,Matlab面向对象编程并不是最有效的。(但是越来越好了?)人们往往不去定义类,等等。。如果你在C++或者java等中编码,那么你就可以在所有地方进行。“RayRyGee,这是我的第一个方法,但是必须手动实现每个类运算符,比如+,-*,,,^等等。如果我能从“double”中派生出来,我可以避免所有这些。@matthew在r2015b中使用了新的执行引擎,不再存在明显的性能劣势。这看起来正是我想要的。我试图从double派生,但将我的矩阵声明为属性,并得到一个模糊的错误。不幸的是,(或幸运的是)我要到假期后才能回到办公室来尝试你的方法。如果它有效,我会把它标记为答案。干得好!要使
myDouble
与原来的
double
类更加一致,不如尝试利用所述的
empty
方法,而不是分配1x1
NaN
数组?@mikkola谢谢,在我的初始任意
NaN
初始化之后,我确实尝试了一个
空的
,使用
inval=[]
。实际上,这可能相当于根本不检查
nargin
,而只是将初始化
inval
放入
double()
。问题是,我的simple
disp
hack与空的
double
不同,它不会为空数组显示任何内容。一个更优雅的
的尝试似乎也给出了同样的结果。我试着玩
显示
,但没有成功。有什么想法吗?
>> magic(3)

ans =

     8     1     6
     3     5     7
     4     9     2

>> myDouble(magic(3))

ans = 

     8     1     6
     3     5     7
     4     9     2