我在 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 可访问,而对象数组被视为空变量。
function varargout = doSomething (varargin)
global objectsArray variableA
aaa = variableA;
bbb = objcetsArray(1).property; <--- code crashes here
end
代码在执行定义bbb
的指令时崩溃。调试模式显示对象数组为空,变量 A 等于其值 123。结束调试模式,因此退出函数的执行,objectsArray 被定义为我所期望的,作为 3 个对象的结构。
我的问题是,为什么会这样?为什么似乎可以调用全局变量,但如果将它们定义为对象,则不能?
经过一番研究,我意识到问题不在于对象本身,而在于全局变量的概念以及 MATLAB 如何使用它。
尝试使结构全局时,会出现相同的问题。
用户史蒂文·洛德(Steven Lord)在此线程中解释了我问题的答案:
这里的问题不是由全局引起的,至少不是直接引起的。什么时候 您将一个变量定义为全局变量,它以空开头 (0 x 0)双精度数组。所以这行:
全球array_Structure
将array_Structure设置为包含 [] 的全局数组。
现在,当您尝试将结构数组 (data_Struct) 分配给 元素的array_Structure双精度变量,因为变量 必须全部为一种类型,MATLAB 必须转换其中一个变量 进入对方的类型。在这种情况下,由于您尝试将 结构到双精度数组中,它尝试将结构转换为 双阵列。对于某些内置数据类型对,MATLAB 知道 如何在两种数据类型之间隐式转换(例如, 双倍到单) - 但结构和双倍不是这些对之一 类型,所以 MATLAB 说将结构转换为双精度是 不可能。它不知道该怎么做。