Matlab:关于句柄变量和mat文件的文档?

时间:2016-03-16 02:23:13

标签: matlab oop handle

在保存和加载mat文件时,是否有关于如何处理句柄变量的TMW文档?从试验和错误,我已经确定了基本的行为,例如,底层对象存储到mat文件,并从mat文件加载,但实际的类定义本身不是。也就是说,您加载一个句柄对象,但是您的类定义已经通过添加字段进行了修改,加载的对象将具有这些附加字段,但它们不会使用值进行初始化。

对于那些在面向对象编程中定义句柄类的人来说,设计用于行为的更全面的文档是不可或缺的。例如,如果将对象A保存到mat文件,并且它具有引用对象Z的属性,然后将对象B保存到mat文件,它还包含引用对象Z的属性,该怎么办?如果我加载两个mat文件中的每一个,是否会有两个单独的对象Z实例,或者这两个变量是否会引用同一个对象?

另一种情况可能是两个句柄对象变量引用同一个对象,但是一个变量在基础工作区中而另一个变量实际上是另一个对象的属性?如果我保存并加载,两个变量是否仍然指向同一个对象?

我知道我可以凭经验对每种可能的场景进行逆向工程,但它的效率远低于阅读行为规范(如果存在的话)。

2 个答案:

答案 0 :(得分:4)

Matlab句柄对象只要它们在内存中就通过引用传递。但是,当它们被保存并重新加载时,它们是一个新对象,因此,任何对它们的引用都会被破坏。 (见下面的例子)。对于类句柄的所有对象都是如此,无论您构造的案例有多复杂(例如$( document ).ready(function(){ $("#liAfterLogin").css("display", "block"); }); objectA的属性,而objectB的属性将突然占用objectA重新加载后会有更多内存):从磁盘加载对象会创建一个新的未引用的实例。

objA = myHandleObject();
objB = objA; %# same object, changing A changes B
save('objOnDisk.mat','objB');
load('objOnDisk.mat') %# overwrites objB in the workspace
%# objB is no longer a reference of objA

如果您修改一个句柄对象,这一点尤为明显。群集上的parfor循环,因为工作空间被保存并重新加载到各个工作者上。

有一种解决方法:您可以定义loadobj函数以查找同一类的其他对象,以及向每个对象添加唯一引用号(将属性设置为tempname ,例如),你可以"重建"手动引用。去过那里,完成了,但是不能推荐,因为它真的非常复杂。

答案 1 :(得分:1)

我要感谢受访者。他们的答案非常有帮助。但是,问题是是否记录了句柄对象变量的保存/加载行为。答案似乎是“不”,我会问TMW是否觉得值得记录下来。

除了Jonas关于保存/加载行为的信息之外,我创建了以下测试以确定(i)加载整个工作区与(ii)单个句柄对象变量时加载行为的差异。正如我在评论中推测的那样,同一对象的多个句柄在情况(i)中保持对公共对象的引用,但它们在情况(ii)中引用单独的(但相同的)对象:

% myClassA.m
%-----------
% Handle class
classdef myClassA < handle
properties
   myPropA
end % properties
end % classdef

% myClassB.m
%-----------
% The property will refer to a
% handle class object
classdef myClassB
properties
   myObjA
end % properties
end % classdef

% test.m
%--------
% Main test script, uses the two
% classes
clc
echo on

% Create 2 object variables. 2nd
% one has a property that refers to
% same object as the first one
objA = myClassA
objA.myPropA = 5
objB = myClassB
objB.myObjA = objA

% Check that changes in handle object
% is seen from both variables
objA.myPropA = 7
objB.myObjA.myPropA % Should be 7

% Save & load entire workspace.
% Check that both variables refer
% to same object.
save('myWrkSpc')
clear classes
load('myWrkSpc')
objA
objB.myObjA
objA.myPropA = 9
objB.myObjA % Should be 9

% Load variables individually. Show
% that they now refer to separate
% objects
clear classes
load('myWrkSpc','objA')
load('myWrkSpc','objB')
objA
objB.myObjA
objA.myPropA = 9
objB.myObjA
   % Should still be 7 instead of 9

echo off

这些是我到目前为止遇到的情景,但我确信我会遇到新的情况,其中对所设计的行为的全面记录会有所帮助。