2016-07-19 10 views
1

配列を含むMatlab構造体があります。これは、ループ配列の構造体/配列をMatlabの単一の配列に変換します

% here simplified for your convenience 
for i = 1:27 
    info(i).field1 = rand(1,4); 
    info(i).field2 = rand(1,4); 
    info(i).field3 = rand(1,4); 

そして、(私の値で)埋め経由満ち

info(27).field1 = []; 
info(27).field2 = []; 
info(27).field3 = []; 

次のようになります:具体的には次のように割り当てられている私はこれがしたい

[1048576;0;0;0] [1;0;0;0] [1;0;0;0] 
[1047512;0;1064;0] [0,99;0;0,01;0] [1;0;8;0] 
[1047900;0;676;0] [0,94;0;0,07;0] [2;0;3;0] 
... 

配列の単一の値を列として使用してテーブルファイルとして保存できる単一の(27x12)テーブルwritetable(T,'myData.csv', ...') (テーブルの見出しは次のように見えるかもしれません。無視):

1.A  1.B 1.C  1.D  2.A  2.B 2.C 2.D  3.A 3.B 3.C 3.D 
___  ___ ___  ___  ___  ___ ___ ___  ___ ___ ___ ___ 
1048576 0 0  0  1,00 0 0  0 1 0 0 0 
1047512 0 1064 0  0,99 0 0,01 0 1 0 8 0 
1047900 0 676  0  0,94 0 0,07 0 2 0 3 0 

あるいはさらに良い

1.A  1.B 1.C  1.D  2.A  2.B 2.C 2.D  3.A 3.B 3.C 3.D 
___  ___ ___  ___  ___  ___ ___ ___  ___ ___ ___ ___ 
1048576 0 0  0  100% 0% 0% 0%  1 0 0 0 
1047512 0 1064 0  99%  0% 1% 0%  1 0 8 0 
1047900 0 676  0  94%  0% 7% 0%  2 0 3 0 

私がこれまで試したことはある:

T = table(info) %obviously doesn't work 

info  
_____________ 

[1x27 struct] 

とセルアレイ

% create a cell array and try to concatenate the arrays in the array 
C = struct2cell(info) 
Cp = permute(C,[3 1 2]); 
Cpx = horzcat(Cp(:,1),Cp(:,2),Cp(:,3)); 
T = table(Cpx) 

T = 

        Cpx     
________________________________________ 

[4x1 double] [4x1 double] [4x1 double] 
[4x1 double] [4x1 double] [4x1 double] 
[4x1 double] [4x1 double] [4x1 double] 
... 

と回避策私はhorzcatがうまくいくと思ったが、何とか私はできるなぜそうでないのか、私の頭を包んでいない。誰かがこれのための解決策を持っていますか?

答えて

1

horzcatを呼び出すと、(セル配列として)Cpの3つの列が単純に連結されます。それらはすでに列であるため、出力は入力と同じです。

あなたが一緒に内容を連結する場合は、最初にcell2matを使用して行列に変換しtableを作成するために、array2tableにこれを直接渡すことができます。

T = array2table(cell2mat(Cp)); 

更新

元のベクトルが代わりに4x1ている場合は、次の操作を行うことができます

T = array2table(squeeze(cell2mat(struct2cell(info))).') 
+0

は、あなたの答えをありがとう!私はいくつかのバリエーションでこれを試しましたが、少し詳しく説明しました: – Honeybear

+0

@Honeybearコメントが途切れたようです。詳細は何ですか? – Suever

+0

構造体に含まれるベクトルは垂直(4x1)なので、 'cell2mat(Cp)'は値を垂直に積み重ねました(27x3構造体は108x3行列になりました)。これを修正するために、構造体に含まれているベクトル(例えば '[1; 0; 0; 0]')を '1 0 0 0 'と' v = v'のように変更しました。どのようにループなしでそれを行うだろう)。その後、それは働いた(27x12テーブル)。どうもありがとう。 P.S .:誤って、改行をしようとしているEnterを押してコメントを送信してください;) – Honeybear