Programming with MATLAB | ![]() ![]() |
構造体配列内のデータの構造化
構造体配列の構造化の鍵は、情報のサブセットへどのようにアクセスしたいかを決定することです。これは構造体をもつ配列をどのように作るか、また構造体のフィールドをどのように分解するかを決定します。
たとえば、3つの異なる配列RED
, GREEN
,
BLUE
に格納された128行128列のRGBイメージを考えます。
このようなデータを構造体配列に構造化する方法が少なくとも
2つあります。
面の構造化
上記の左の場合、構造体の各フィールドがイメージ面全体になります。つぎのようにして、この構造体を作成できます。
A.r = RED; A.g = GREEN; A.b = BLUE;
この方法を使って、一度にイメージ全体に渡り、機能する表示やフィルタリング、他の処理を行ったイメージの面全体を抽出ができます。たとえば、赤の面にアクセスするためには、つぎのようにします。
red_plane = A.r;
面の構造化は、この場合に複数のイメージに拡張可能である長所があります。イメージが多数あれば、それらをイメージ全体を含むA(2)
,
A(3)
等として格納できます。
面の構造化の短所は、面のサブセットへのアクセスが必要なときに明らかになります。たとえば、サブイメージにアクセスするためには、各フィールドに別々にアクセスする必要があります。
red_sub = A.r(2:12,13:30); grn_sub = A.g(2:12,13:30); blue_sub = A.b(2:12,13:30);
要素単位の構造化
右のケースは、データのサブセットのアクセスが容易である長所を示します。この構造化により、データをセットアップするためには、つぎのようにします。
for i = 1:size(RED,1) for j = 1:size(RED,2) B(i,j).r = RED(i,j); B(i,j).g = GREEN(i,j); B(i,j).b = BLUE(i,j); end end
要素単位の構造化を使って、単一のステートメントでデータのサブセットにアクセスできます。
Bsub = B(1:10,1:10);
しかし、要素単位の方法を使ってイメージの面全体にアクセスするためには、ループが必要です。
red_plane = zeros(128,128); for i = 1:(128*128) red_plane(i) = B(i).r; end
要素単位の構造化は、ほとんどのイメージ処理のアプリケーションに対しては、最良の構造体配列の選択にはなりません。しかし、構造体フィールドの対応するサブセットにルーチン的にアクセスする必要がある他のアプリケーションに対しては最も良い方法かもしれません。つぎの節の例は、このタイプのアプリケーションを説明するものです。
例題:簡単なデータベース
各々の可能な構造化は、データにどのようにアクセスするかにより、異なる長所があります。
avg = mean(A.amount);
要素単位の構造化を使うと、
avg = mean([B.amount]);
function client(name,address) disp(name) disp(address)
関数client
をコールするためには、
面の構造化を使うと、
client(A.name(2,:),A.address(2,:))
要素単位の構造化を使って、構造体全体を渡します。
function client(B) disp(B)
要素単位の構造化を使うと、
client(B(2))
name
フィールドやaddress
フィールドを頻繁に作成し直す必要があるかもしれません。データは、選択する構造化の方法とは一般に無関係です。ユーザはデータへのアクセスやデータの操作をどのようにしたいかを考えなければなりません。
![]() |
構造体の操作のために関数を作成 | 入れ子型の構造体 | ![]() |