キャッシュされた評価のための関数があります。引数の 1 つとして、関数ハンドルを取ります。状況によっては、関数ハンドルにアクセスできないことがありますが、その理由はよくわかりません。以下の例は、何が私を困惑させたかを示しています。
>> A.a = @plus; feval(@A.a, 1, 1)
ans =
2
>> clear A
>> A.a.a = @plus; feval(@A.a.a, 1, 1)
Error using feval
Undefined function 'A.a.a' for input arguments of type 'double'.
そのため、関数ハンドルを構造体のメンバーとして格納している場合、1 レベルの深さであれば問題なく渡すことができますが、2 レベルの深さでは渡すことができません。私の実際の使用例ではD
、さまざまなクラスの多くの (117) インスタンスを保持する構造体があるため、実際にはstct.obj.meth
、stct
は構造体、obj
はクラス インスタンス/オブジェクト、meth
はメソッドです。パス@stct.obj.meth
は失敗しますが、 を割り当てるA = stct.obj
と、パスは@A.meth
成功します。
どのような条件下で関数ハンドルを引数として渡すことができるので、スタックの下にアクセスできるようになりますか?
編集:上記のユースケースでは、すでに関数ハンドルである@
ため、単純に削除できます。@plus
ただし、次の状況を考慮してください。
>> type cltest.m
classdef cltest < handle
methods
function C = mymeth(self, a, b)
C = a + b;
end
end
end
>> A.a = cltest();
>> feval(@A.a.mymeth, 1, 1)
Error using feval
Undefined function 'A.a.mymeth' for input arguments of type 'double'.
>> b = A.a;
>> feval(@b.mymeth, 1, 1)
ans =
2
この場合、前が必要です...@
A.a.mymeth