MATLAB Answers

Aditya Jain

create an array of single struct

Aditya Jain
さんによって質問されました 2015 年 11 月 9 日
最新アクティビティ Guillaume
さんによって コメントされました 2015 年 11 月 9 日
structElement = struct('a1','', 'a2', '', 'a3', '', 'a4', '');
s1 = repmat(structElement, [1,1]);
The above code gives a 1x1 struct
s2 = repmat(structElement, [2,1]);
The above code results in a 2x1 struct
If I do s2(1) it returns a struct
If I do s1(1) it returns a1.
How can I create s1, such that s1(1) will give me back a struct. Basically I want to create an array of single struct.

  2 件のコメント

2015 年 11 月 9 日
Both those syntaxes return the full struct. They do in Matlab R2015b that I am using.
s1 = structElement;
would do though. The repmat instruction is redundant.
2015 年 11 月 9 日
I'm fairly certain they've done so in every version of matlab (barring any bug).
It would never make any sense for an index to return a field of a structure. Particularly since everything in matlab, including scalar structures, is always an array.

サインイン to comment.



1 件の回答

回答者: Guillaume
2015 年 11 月 9 日

"If I do s1(1) it returns a1." No, it also returns a structure.
Both s1 and structElement are arrays of a single struct:
ans =
a1: ''
a2: ''
a3: ''
a4: ''
ans =
1 1
ans =
1 1
Everything in matlab is an array. Scalars (numbers, structs, objects, etc.) are stored as array of size 1x1

  3 件のコメント

Aditya Jain
2015 年 11 月 9 日
My bad. You are right. Is there a way I can create a cell array of structs instead of normal matrix?
Walter Roberson
2015 年 11 月 9 日
s2 = repmat({structElement}, [2,1]);
2015 年 11 月 9 日
You can create cell arrays of structures the same way you create cell arrays of numbers, by plain assignment, using arrayfun / cellfun, using num2cell, etc.
s = struct('a', {1 2 3 4 5}, 'b', ''); %creates a 1x5 array of struct
c = num2cell(s); %convert matrix to cell array
Another way:
s = struct('a', '', 'b', '');
c = cell(2, 5);
c(:) = {s};
However, if all the structures have the same fields, I don't see the point of storing them in a cell array.

サインイン to comment.

Translated by