我知道line(X,Y)命令返回一个line对象。 这就是为什么我不理解以下代码:
myline=line([1 2],[1 1]);
x=[];
x(2,2)=myline
返回 x = [0 0; 0 7.0001] 为什么?为什么7.0001?为什么x(2,2)不是线对象?
isfloat(x(2,2)) %this returns true
isgraphics(x(2,2),'line') %this also returns true!
set(x(2,2),'LineStyle','--') %this works fine
x(2,2)+1 %this also works fine!
x(2,2)如何同时成为浮点数和线对象?为什么它一开始就是浮动?
如果这个问题的答案冗长而复杂,我也很高兴只是链接到某处,解释了这种行为。 (我知道这些在技术上不止一个问题。但在我看来,它们都属于一个并且有相同的答案)
答案 0 :(得分:2)
您在这里看到的是MATLAB的分配规则以及新旧手柄图形系统之间的兼容性层的组合。
首先,当你对一个数组进行赋值时(包括当你指定数组的“结尾”)时,该数组的类型永远不会改变 - 而是转换右边的类型(如果可能的话)匹配你分配的数组。在您的情况下,通过执行x = []
,您将x
设为0x0
类型double
的数组。当您分配到(2,2)
元素时,line
对象将转换为double
。
您可以将line
对象转换为double
值,这是为了兼容MATLAB旧的句柄图形实现。原始的手柄图形系统是在MATLAB具有功能齐全的面向对象编程系统之前开发的,因此所有图形对象都由唯一的双精度数字表示,而不是line
个对象。在新系统中,为了保持与旧代码的向后兼容性,仍然可以将line
个对象等视为双精度数。
您可以通过调用
显式地看到此行为double(myline)
如果您愿意,可以使用gobjects
来指定一个空的图形占位符元素数组:
myline = line([1 2],[1 1])
x = gobjects(0);
x(2,2) = myline;
class(x(2,2)) % gets 'matlab.graphics.primitive.Line'