2012-03-18 16 views
1

私は構造に簡単な問題があります。matlab:構造データとマルチレベルインデックス

は、作成することができます:

x(1).a(:, :) = magic(2); 
x(2).a(:, :) = magic(2)*2; 
x(3).a(:, :) = magic(2)*3; 

全てのx-ESから(1、1)を一覧表示する方法?

私はそれが好きでやってみたかった:

x(1, :).a(1,1) 

をが、エラーがあり、「マルチレベルのインデックスのこのタイプのために必要なスカラインデックスが。」

どのようにアプローチするのですか?私はループでそれを行うことができますが、それはおそらく最悪の解決策です:) ありがとう!

答えて

2

これは、この種の索引付けを直接行うことができないため、このような問合せを行う場合は、これが最良のデータ構造ではありません。

しかし、ここで働く一つのアプローチです:

cellfun(@(X) X(1,1), {x.a}) 

を構文{x.a}は、セル配列に「構造体配列」からxを変換しますが。次に、cellfunを使用して、セル配列上のマップとして関数を適用します。匿名関数@(X) X(1,1)は1つの引数Xをとり、X(1,1)を返します。あなたも、この方法であなたのデータを取得することができます

+0

ありがとうございました。しかし、もし私がf.exを持っていたいならどうしますか? x(1、:)。a(:、1)? – Art

2

B = cat(3,x.a); 
out = reshape(B(1,1,:),1,[]); 

ところで、ループは悪ではありません。ベクトル化された索引付けよりも高速な場合もあります。面で最高のあなたに合ったものを参照してください、それを両方の方法を試してみてください。

  • 速度 -
  • コード明瞭性を確認するためにプロファイラを使用 - 文脈に依存します。場合によってはベクトル化されたコードがよりよく見えることがあります。