为什么line()并不总是返回一个line-object?为什么它有时似乎会返回双倍?

时间:2017-05-25 01:38:24

标签: matlab line return-value

我知道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)如何同时成为浮点数和线对象?为什么它一开始就是浮动?

如果这个问题的答案冗长而复杂,我也很高兴只是链接到某处,解释了这种行为。 (我知道这些在技术上不止一个问题。但在我看来,它们都属于一个并且有相同的答案)

1 个答案:

答案 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'