How can I merge two structs?

44 ビュー (過去 30 日間)
Sander Janssen
Sander Janssen 2022 年 10 月 11 日
コメント済み: Sander Janssen 2022 年 10 月 11 日
My question might become a bit complicated, so please let me know if I have not explained something well.
I have got a structure that has two relevant fields, one field is a character which shows the date and the other field is a structure with data, let's call them A.date (char) and A.data (struct).
Some of the dates are duplicate (on purpose) I would like to add the values from the structure of those duplicates to the structure with the same date (so effectively merging the structures).
Sketch of what I'd like to achieve:
for i=1:length(A)
if A(i).date == A(i+1).date % Will work untill final value is reached
A(i).data + A(i+1).data % Won't work, but I would want to merge A(i).data + A(i+1).data
end
end
Any help is greatly appreciated, thanks in advance!
  2 件のコメント
Ghazwan
Ghazwan 2022 年 10 月 11 日
Can you please share a file for the struc A?
Sander Janssen
Sander Janssen 2022 年 10 月 11 日
I have made an example structure that looks the same (just different names/values).

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

回答 (1 件)

Benjamin Thompson
Benjamin Thompson 2022 年 10 月 11 日
Due to the need to merge it might be easiest to use struct2table, table2timetable, make sure it is merged well as a time table, then table2struct to change it back to the struct data type.
  7 件のコメント
Benjamin Thompson
Benjamin Thompson 2022 年 10 月 11 日
編集済み: Benjamin Thompson 2022 年 10 月 11 日
If you don't know the names of the fields in the two structures you are merging then it gets awkward. This is for copying one field of A2.data over to A1.data. You can generalize this into a loop that runs length(fields) times.
» fields = fieldnames(A(2).data);
» A(1).data = setfield(A(1).data,fields{1},getfield(A(2).data,fields{1}))
A =
1x12 struct array with fields:
date
data
» A(1).data
ans =
struct with fields:
a: 'something'
b: 'a number'
c: 'another value'
d: 10
e: 'something else'
Then to delete A(2):
» A(2) = []
A =
1x11 struct array with fields:
date
data
Now if you know the fields of A1.data and A2.data:
» A(1).data = struct('a', A(1).data.a,'b', A(1).data.b,'c', A(1).data.c,'d', A(1).data.d, 'e', A(2).data.e, 'f', A(2).data.f, 'g', A(2).data.g, 'h', A(2).data.h)
A =
1x12 struct array with fields:
date
data
» A(1).data
ans =
struct with fields:
a: 'something'
b: 'a number'
c: 'another value'
d: 10
e: 'something else'
f: 'a different number'
g: 'another value'
h: 10
Sander Janssen
Sander Janssen 2022 年 10 月 11 日
The problem is that I do not know which row will be a duplicate, so I'd first need to identify that. I might be able to add them beforehand but I'll have to check that...

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

カテゴリ

Help Center および File ExchangeStructures についてさらに検索

製品


リリース

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by