Remove the Last Entry of Many Fields of a Structure

I have a multiple structures with many fields, and each field has thousands of entries (rows). I need the each field in a particular structure to have the same number of entries (rows). For instance, here is a sample of my situation:
data.test1=1:10;
data.test2=3:12;
data.test3=2:11;
data.test4=1:10;
data.test5=2:10;
data.test6=4:12;
data.test7=5:13;
data = structfun(@transpose,data,'UniformOutput',false);
How can I trim the last entry (row) from data.test1, data.test2, data.test3, and data.test4 programmatically? (In my real structures, I have many more fields, so I would prefer to not trim each field one at a time. I would greatly prefer to trim all the necessary fields in one command.) Will someone please help?

 Akzeptierte Antwort

Adam Danz
Adam Danz am 8 Nov. 2021
dataTrimmed = structfun(@(s)s(1:end-1),data,'UniformOutput',false);

3 Kommentare

Thank you for the response, Adam Danz!
You're solution removes the last entry (row) in all the fields. I want to remove the last entry (row) in the fields that are longer than the shortest field. So, so my example, I only want to remove the last entry (row) in data.test1, data.test2, data.test3, and data.test4 while leaving data.test5, data.test6, and data.test7 unchanged. How could I modify your suggestion to edit only the fields that are the longest length?
Sorry, I misunderstood. Here's how to do that,
data.test1=1:10;
data.test2=3:12;
data.test3=2:11;
data.test4=1:10;
data.test5=2:10;
data.test6=4:12;
data.test7=5:13;
data = structfun(@transpose,data,'UniformOutput',false)
data = struct with fields:
test1: [10×1 double] test2: [10×1 double] test3: [10×1 double] test4: [10×1 double] test5: [9×1 double] test6: [9×1 double] test7: [9×1 double]
% Get min count
minCount = min(structfun(@numel, data))
minCount = 9
% trim to min count
dataTrimmed = structfun(@(s)s(1:minCount),data,'UniformOutput',false)
dataTrimmed = struct with fields:
test1: [9×1 double] test2: [9×1 double] test3: [9×1 double] test4: [9×1 double] test5: [9×1 double] test6: [9×1 double] test7: [9×1 double]
That's perfect! thank you so much!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

data.test1=1:10;
data.test2=3:12;
data.test3=2:11;
data.test4=1:10;
data.test5=2:10;
data.test6=4:12;
data.test7=5:13;
n = structfun(@numel,data);
toremove = n-min(n);
fn = fieldnames(data);
for ii = 1:numel(fn)
data.(fn{ii}) = data.(fn{ii})(1:(numel(data.(fn{ii}))-toremove(ii)));
end
struct2table(data)
ans = 1×7 table
test1 test2 test3 test4 test5 test6 test7 __________ __________ __________ __________ __________ __________ __________ 1×9 double 1×9 double 1×9 double 1×9 double 1×9 double 1×9 double 1×9 double
The interior of that loop could obviously be made clearer but I'll leave that as an exercise.

Kategorien

Mehr zu Detection, Range and Doppler Estimation finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by