2017-05-25 93 views
2

我知道這行(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)如何在同一時間成爲一個浮點數和一個線對象?爲什麼它在開始時是浮動的?

如果這個問題的答案很長很複雜,我也很高興看到一個鏈接到某個地方,在這裏解釋這個行爲。 (我知道這些在技術上不止一個問題,但在我看來,它們都屬於同一個問題,並且具有相同的答案)

回答

2

這裏看到的是MATLAB的分配規則和新舊圖形處理系統。首先,當你對一個數組進行賦值時(包括當你指定「離開數組的末尾」時),該數組的類型永遠不會改變 - 相反,右側的類型被轉換(如果可能)匹配您分配的數組。在你的情況下,通過執行x = [],你使得x成爲double類型的0x0數組。當您分配給(2,2)元素時,line對象將轉換爲double

事實上,您可以將line對象轉換爲double值,這是爲了與MATLAB舊的圖柄處理實現兼容。原來的手柄圖形系統是在MATLAB有一個功能齊全的面向對象編程系統之前開發的,所以不是像對象那樣的東西,所有圖形對象都由唯一的雙精度數字表示。在新系統中,爲了保持與舊代碼的向後兼容性,仍可以將對象等視爲雙精度數字。

你可以明確地看到此行爲通過調用

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' 
相關問題