2

Matlab で次のデータ構造をベクトル化しようとしていますが、効率的な方法を見つけたりコーディングしたりできません。
A = 1x2 フィールドを持つ構造体配列: [a , b , c]
A(1) = a: 1 , b: 2 , c: [1x1 構造体]
A(1).c = キー: 5
A(2) = a : 1 , b: [] , c: [1x3 struct]
A(2).c = フィールドを持つ 1x3 構造体配列: [key , key2]
A(2).c(1).key = 3
A(2). c(2).key = 4
A(2).c(3).key = 7
A(2).c(1).key2 = 10
A(2).c(2).key2 = []
A( 2).c(3).key2 = 17

知っている。これは非常に非効率的なデータ構造です。そのため、インデックスを使用してベクトル化しようとしているため、最終的な構造は
A = 1x1 構造のフィールド [a 、 b 、 c 、 b_index 、 c_index]
Aa = [1 1]
Ab = [2]
A.b_index =のようになります。 [1]
Ac = フィールドを持つ 1x1 構造 [key key2 key2_index]
A.c_index = [1 2 2 2]
Ackey = [5 3 4 7]
Ackey2 = [10 17]
Ackey2_index = [2 4]

私の試み 1: 最初に各レベル (この例では、具体的には A、c、キー 3 レベル) で parfor を試し、最初に調査を行って、それが空かどうか、含まれているデータを確認しました。これにインデックスを付ける必要がありますか?分野。構造体の葉でない場合は vertcat(x.(fieldname)) です。しかし、そうであれば、セルとしてパッケージ化し、再帰的にプッシュダウンしてベクトル化します。

それは機能しますが、残念ながら時間がかかりすぎます。プロファイルを作成すると、常に使用されている mex 分布関数が表示されました。これは、すべてのレベルで parfor を実行しているためだと推測しています。そのため、MATLAB はすべてのレベルで非常に頻繁に各ワーカーにインデックスを付けて配布する必要があります。

私の試み2: 私は最初に完全に構​​造の parfor 調査をしようとしました。各フィールドに uint8 値を使用します。そして、結合段階で、まず vertcat を使用して調査結果をチェックし、インデックスを作成する必要があるかどうか、およびデータ フィールドに対して cat(3,...) を実行する必要があるかどうかを確認します。しかし、それはメモリの効率が悪く、調査段階では遅いです。そして、合体段階ではあまりスピードアップしません。インデックス作成ははるかに簡単になりますが。

私の質問は
1だと思います。最初の試行がより効率的になるように、parforのみがインデックスを作成して配列全体を1回配布するようにコーディングするにはどうすればよいですか、それとも2回目の試行がより良いアイデアですか?
2. 問題に対する適切な一般的なアプローチは何ですか?

4

1 に答える 1

0

あなたの2.質問に対する私の2セント:Matlabparforは単純な配列/行列でより速く動作します。これは、配列がメモリ内で伝染的に割り当てられるため、より高速なアクセスと計算が可能になるためです。したがって、プログラムの読みやすさではなくパフォーマンスに関心がある場合は、複雑な構造を使用する代わりに、より単純な配列などを使用することをお勧めします。

于 2015-10-27T09:51:55.823 に答える