【问题标题】:MATLAB OOP global objects in functions seen as empty函数中的 MATLAB OOP 全局对象被视为空
【发布时间】:2017-04-06 09:22:50
【问题描述】:

在将对象变量声明为全局变量时,我在 MATLAB 中遇到了一个奇怪的行为。在我定义的所有全局双精度似乎都可以通过函数识别的情况下,似乎不可能对对象或从类定义的对象结构做同样的事情。这就是我所做的。

类定义:

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 为空,variableA 等于其值 123。结束调试模式,因此退出函数的执行,objectsArray 被定义为我所期望的,作为 3 个对象的结构。

我的问题是,为什么会发生这种情况?为什么似乎可以调用全局变量,但如果它们被定义为对象则不行?

【问题讨论】:

    标签: matlab function oop struct global-variables


    【解决方案1】:

    经过一番研究,我意识到问题不在于对象本身,而在于全局变量的概念以及 MATLAB 如何使用它。

    尝试使结构全局化时会出现同样的问题。

    用户 Steven Lord 在this thread 中解释了我的问题的答案:

    这里的问题不是由全局引起的,至少不是直接引起的。什么时候 您将变量定义为全局变量,它开始为空 (0×0) 双精度数组。所以这一行:

    全局数组_结构

    将 array_Structure 设置为包含 [] 的全局数组。

    现在,当您尝试将结构数组 (data_Struct) 分配给 array_Structure 双变量的元素,因为变量 必须是一种类型,MATLAB 必须转换其中一个变量 进入对方的类型。在这种情况下,因为你试图把 struct 转换为 double 数组,它会尝试将 struct 转换为 双数组。对于某些内置数据类型对,MATLAB 知道 如何在两种数据类型之间隐式转换(例如, double to single)——但 struct 和 double 不是其中一对 类型,所以 MATLAB 说将结构转换为双精度是 不可能。它不知道该怎么做。

    【讨论】:

      猜你喜欢
      • 2017-05-11
      • 2014-08-01
      • 2013-05-23
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      相关资源
      最近更新 更多