是否可以从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
方法,而不是分配1x1NaN
数组?@mikkola谢谢,在我的初始任意NaN
初始化之后,我确实尝试了一个空的,使用inval=[]
。实际上,这可能相当于根本不检查nargin
,而只是将初始化inval
放入double()
。问题是,我的simpledisp
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