Main Content

オブジェクトの再検索の回避

ハンドルを検索する場合、MATLAB® はオブジェクト階層を検索して一致するハンドルを検出しなければならず、時間がかかります。後でアクセスが必要となるハンドルを保存しておくのが時間を短縮できる方法です。通常、findobjfindall を使用するより、配列インデックス付けの方が高速です。

次のコードは 500 個の line オブジェクトを作成した後、ループ内で findobj を呼び出しています。

figure
ax = axes;
for ix=1:500
   line(rand(1,5),rand(1,5),'Tag',num2str(ix),'Parent',ax);
end
drawnow;
for ix=1:500
   h = findobj(ax,'Tag',num2str(ix));
   set(h,'Color',rand(1,3));
end
drawnow;

これよりさらに良い方法は、ハンドルを配列に保存し、2 番目の for ループでこの配列にインデックスを付けることです。

figure
ax = axes;
h = gobjects(1,500);
for ix = 1:500
   h(ix) = line(rand(1,5),rand(1,5),'Tag',num2str(ix),'Parent',ax);
end
drawnow;
% Index into handle array
for ix=1:500
   set(h(ix),'Color',rand(1,3));
end
drawnow

検索範囲の制限

ハンドルの検索が必要な場合、オブジェクト ツリー内での開始点を指定して、検索するオブジェクト数を制限します。たとえば、開始点を、検索するオブジェクトを含む Figure または座標軸として指定します。

時間のかかるオブジェクト検索を制限するもう 1 つの方法は、検索の深さを制限することです。たとえば、'flat' オプションを指定して findobj を呼び出すと、特定のハンドル配列内のオブジェクトに検索が制限されます。

関数 findobjfindall を使用してハンドルを検索します。

詳細は、オブジェクトの検索を参照してください。