How to Convert a Scalar Struct with Vector Fields to a Vector Struct with Scalar Fields?

I have a scalar struct S with each field a row vector of the same number of elements.
S.x = [1 2];
S.y = [10 20];
I want create a struct array, A, with same number of elements as in the fields in S, with the same field names as S, where each field value in each element of A is correspondingly indexed from the original field in S. I'm not sure I'm explaining this well.
So far I have this, which works:
C = [fieldnames(s) , arrayfun(@(c) mat2cell(c{1},1,ones(1,numel(c{1}))),struct2cell(s),'Uni',false)].';
A = struct(C{:})
a = 1x2 struct array with fields:
x y
[A.x]
ans = 1x2
1 2
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
[A.y]
ans = 1x2
10 20
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
Open to suggestions on better (e.g., easier to understand) alternatives.

 Réponse acceptée

S.x = [1 2];
S.y = [10 20];
C = [fieldnames(S) , struct2cell(structfun(@num2cell,S,'Uni',false))].';
A = struct(C{:})
A = 1x2 struct array with fields:
x y
[A.x]
ans = 1x2
1 2
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
[A.y]
ans = 1x2
10 20
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>

Plus de réponses (2)

S.x = [1 2];
S.y = [10 20];
C = [fieldnames(S) , cellfun(@num2cell,struct2cell(S),'Uni',false)].';
A = struct(C{:})
A = 1x2 struct array with fields:
x y
[A.x]
ans = 1x2
1 2
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
[A.y]
ans = 1x2
10 20
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
S.x = [1 2];
S.y = [10 20];
N = numel(S.x);
f = fieldnames(S);
NF = numel(f);
clear A
A(N) = S;
for ii = 1:N
for jj = 1:NF
A(ii).(f{jj}) = S.(f{jj})(ii);
end
end
A
A = 1x2 struct array with fields:
x y
[A.x]
ans = 1x2
1 2
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
[A.y]
ans = 1x2
10 20
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>

Catégories

Produits

Version

R2024a

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by