2017-04-06 27 views
0

我在MATLAB中將一個對象變量聲明爲全局時遇到了奇怪的行爲。在我定義的所有全局雙打似乎都可以被函數識別的地方,似乎不可能對類或對象的結構做類似的定義。這就是我所做的。在函數中看到的MATLAB OOP全局對象爲空

類定義:

classdef Class < handle 

    properties 
     property 
    end 

    methods 
     function obj = Constructor(value) 
      if nargin == 1 
       obj.property = value; 
      end 
     end 
    end 

end 

對象陣列的構建:

% Define objects array as global variable to be accessible in functions  
global objectsArray variableA 

% define value of variable A, to be accessible in functions 
variableA = 123; 

% Values to be assigned to objects' property field  
values = [1,2,3]; 

% initialise object array using constructor 
if isempty(objectsArray) 
    objectsArray(3,1) = Constructor(); 
end 

% define objects' property field 
for k = 1:3 
    objectsArray(k) = Constructor(values(k)); 
end 

現在,我想的功能來訪問的對象陣列,並且變量A,上述兩者限定,並且都聲明爲全局變量。但是,如果我按照以下方式構建函數,則只能訪問變量A,而將objects數組視爲空變量

function varargout = doSomething (varargin) 

    global objectsArray variableA 

    aaa = variableA; 
    bbb = objcetsArray(1).property; <--- code crashes here 

end 

該代碼在執行定義bbb的指令時崩潰。調試模式顯示objectsArray是空的,並且該變量A等於它的值123.結束調試模式,退出,因此函數的執行,objectsArray被定義爲我所期望的,作爲3個對象的結構。

我的問題是,爲什麼會發生這種情況?爲什麼回顧全局變量似乎是可能的,但是如果它們被定義爲對象則不可能?

回答

0

經過一番研究,我意識到問題不是對象本身,而是全局變量的概念以及MATLAB如何處理它。

嘗試構建全局結構體時會出現同樣的問題。

我的問題的回答是this thread用戶史蒂芬主解釋說:

這裏的問題不是由全球造成的,至少沒有直接。當你定義一個變量爲全局變量時,它開始爲一個空的 (0乘0)雙數組。因此,這行:

全球array_Structure

套array_Structure是含有[]一個全局數組。

現在,當你試圖將一個結構數組(data_Struct)分配到array_Structure雙變量的 元素,因爲變量 必須是所有的一種類型,MATLAB具有變量 的一個轉換成其他的類型。在這種情況下,由於您試圖將 結構放入雙數組中,它會嘗試將該結構轉換爲 雙數組。對於一些內置的數據類型對,MATLAB知道如何隱式地將兩種數據類型(例如, double到single)進行轉換 - 但struct和double不是這些類型的對之一,所以MATLAB說將一個結構轉換成雙精度是 不可能。它不知道如何去做。