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提高了面向对象代码的性能。在我的答案中添加了链接。