matlab中stuct/class名称的缩短句柄

matlab中stuct/class名称的缩短句柄,matlab,Matlab,我有一个相对复杂的数据树结构。例如: class.data.head{1}.data2 我希望得到的是一个名为data2\u link的变量,用于链接地址class.data.head{1}.data2,以便: (1) 如果class.data.head{1}.data2有任何更改,它也将自动反映到data2_link,反之亦然 (2) 我不必键入长名称来访问class.data.head{1}.data2中的数据 谢谢 Matlab不支持引用。唯一的例外是句柄,它允许引用对象 要使用它,da

我有一个相对复杂的数据树结构。例如:

class.data.head{1}.data2
我希望得到的是一个名为data2\u link的变量,用于链接地址class.data.head{1}.data2,以便:

(1) 如果class.data.head{1}.data2有任何更改,它也将自动反映到data2_link,反之亦然

(2) 我不必键入长名称来访问class.data.head{1}.data2中的数据


谢谢

Matlab不支持引用。唯一的例外是
句柄
,它允许引用对象

要使用它,
data2
必须是具有超类
handle
的对象,然后您可以简单地编写:

data2_link=class.data.head{1}.data2

请注意,除非您使用Matlab2015b或更新版本,否则面向对象的matlab可能会影响您的代码。

有一种非常不推荐的方法。可以创建计算所需表达式的函数句柄:

data2_link = @() evalin('caller', 'class.data.head{1}.data2')
现在,每当你需要这个表达式时,用

>> data2_link()

调用函数handle定义的函数需要额外的括号

刚刚有了另一个想法,您可以使用
subsref
来访问它,并使用
subassign
来编写。这并不是我所说的真正的参考,因为您仍然需要
S
,但它可能在不使用OOP的情况下尽可能接近它

S=substruct('.','data','.','head','{}',{1},'.','data2')
%previous line is the same as: S=struct('type',{'.','.','{}','.'},'subs',{'data','head',{1},'data2'})
f=subsref(class,S)

使用这种方法的后果是什么?为什么不鼓励?这里列出了不鼓励的原因。进一步使用
evalin('caller'..
更糟糕,因为它违反了变量作用域的一般概念,导致代码难以调试。此外,您不能将此引用传递给函数,它将始终在调用方作用域中搜索变量。作为一名黑客,这非常棒,但尽管我真的很想,但我无法让自己站出来我这样做是因为我不想鼓励别人这样做!但无论如何,谢谢你发布答案!你能澄清一下,或者提供最后一句话的来源吗?特别是Matlab 2015b提高了面向对象代码的性能。在我的答案中添加了链接。