How to convert a structure array into vector

278 ビュー (過去 30 日間)
SS
SS 2019 年 8 月 9 日
編集済み: Jos (10584) 2019 年 8 月 9 日
Hello.
I have a structure array (1 x 50000) with 10 fields. The elements in the fields are arrays (1 x 50). I want to convert this structure array into a scalar structure with same fields such that, its size is (50000*50 x 1).
  5 件のコメント
SS
SS 2019 年 8 月 9 日
編集済み: SS 2019 年 8 月 9 日
Hi.
The input is something like,
Main(1).fel1=[1,2,3,4,5];
Main(2).fel1=[10,20];
Main(1).fel2=[2,4,6,8,10];
Main(2).fel2=[150,200];
The output should be,
Main(1).fel1=1, Main(2).fel1=2, Main(3).fel1=3.........Main(7).fel1=20
Main(2).fel2=2, Main(2).fel2=4, ..........................Main(7).fel2=200

サインインしてコメントする。

採用された回答

Stephen23
Stephen23 2019 年 8 月 9 日
編集済み: Stephen23 2019 年 8 月 9 日
S(1).F1 = [1,2,3,4,5];
S(2).F1 = [10,20];
S(1).F2 = [2,4,6,8,10];
S(2).F2 = [150,200];
F = fieldnames(S);
C = num2cell(struct2cell(S),3);
C = cellfun(@(c)[c{:}],C,'uni',0);
C = num2cell(vertcat(C{:}));
T = cell2struct(C,F,1)
Giving:
T =
7x1 struct array with fields:
F1
F2
Checking the first field's values:
>> S.F1 % input
ans =
1 2 3 4 5
ans =
10 20
>> T.F1 % output
ans = 1
ans = 2
ans = 3
ans = 4
ans = 5
ans = 10
ans = 20
  3 件のコメント
Stephen23
Stephen23 2019 年 8 月 9 日
"How can this be implemented if, the size of the arrays is not same throughtout."
Something like this should work:
  1. decide what default value/array should go into those fields that are unassigned (e.g. empty numeric, NaN).
  2. measure the sizes of all vectors
  3. preallocate a cell array of the correct size, using your default value.
  4. loop over the fieldnames
  5. concatenate the data (comma-separated lists will likely be useful here), convert to cell.
  6. assign to the cell array using the length of the concatenated data.
  7. convert to structure using struct2cell.

サインインしてコメントする。

その他の回答 (1 件)

Jos (10584)
Jos (10584) 2019 年 8 月 9 日
Why on earth store scalar values like that? Why not have a simple, highly efficient M-by-N matrix, rather than a cumbersome M-by-1 structure array, with N fields, each storing a single scalar value.
% a structure array with N = 2 fields. Each field holds overall and in total 7 elements
S(1).F1 = [1,2,3,4,5];
S(2).F1 = [10,20];
S(1).F2 = [2,4,6,8,10];
S(2).F2 = [150,200];
A = arrayfun(@(f) [S.(f{:})].', fieldnames(S), 'un', 0)
A = [A{:}] % a 7-by-2 matrix
  3 件のコメント
Jos (10584)
Jos (10584) 2019 年 8 月 9 日
編集済み: Jos (10584) 2019 年 8 月 9 日
One option is to keep the fields blank, or fille the empty spots in my output with NaNs.
One can use my function PADCAT to pad shorter vectors (being concatenated fields) with NaNs:
S(1).F1 = [1,2,3,4,5];
S(2).F1 = [10,20];
S(1).F2 = 2 ;
S(2).F2 = [150,200];
A = arrayfun(@(f) [S.(f{:})].', fieldnames(S), 'un', 0)
A = padcat(A{:}) % a 7-by-2 matrix
PADCAT can be found on the File Exchange:

サインインしてコメントする。

カテゴリ

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by