我知道line(X,Y)命令返回一个线对象。那就是为什么我不理解以下代码:
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)如何同时是float和line对象?为何在开始时会浮动?
如果对这个问题的回答冗长而复杂,那么我也很高兴仅链接到解释了此行为的某个地方。(我知道从技术上讲,这些不只是一个问题。但是在我看来,它们都属于同一个人并且有相同的答案)
您在这里看到的是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'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句