Extract length of data in a structure

20 次查看(过去 30 天)
I have a structure with arrays of different size inside:
STRUC(1).meas=ones(101,2)
STRUC(2).meas=ones(34,2)
STRUC(3).meas=ones(33,2)
STRUC(4).meas=ones(101,2)
now I want to get an index, which shows me all entries, where the size of STRUC.meas is > 100:
idx=[1 4]
so that I can filter all entries of STRUC with this condition (incl. other fields) with
STRUC(idx)
As I understand structfun is only for scalar structs... is there an easy and elegant way (if possible without for-loop)?

采纳的回答

Jos (10584)
Jos (10584) 2014-1-26
Still no need for a conversion:
a(1).b=ones(4,8);
a(2).b=ones(8,1);
a(3).b=ones(3,2);
a(4).b=ones(7,1);
lengths = arrayfun(@(x) size(a(x).b,1), 1:numel(a))
keepA = a(lengths>5)

更多回答(2 个)

Jos (10584)
Jos (10584) 2014-1-24
编辑:Jos (10584) 2014-1-24
No need for conversion to cell array. Use STRUCTFUN on the structure directly:
a(1).b=ones(4,8);
a(2).b=ones(8,1);
a(3).b=ones(3,2);
a(4).b=ones(7,1);
lengths = structfun(@(x) size(x,1), a)
keepA = a(lengths>5)
  2 个评论
Patrik Ek
Patrik Ek 2014-1-24
Sorry, this will not work on a struct array. structfun works only on scalar structs, thus the struct array need to be converted to a format matlab can handle.
Jos (10584)
Jos (10584) 2014-1-26
Yes, you're right. But there is really no need for a conversion! See my 2nd answer.

请先登录,再进行评论。


W. Owen Brimijoin
W. Owen Brimijoin 2014-1-24
If you are intent on avoiding a for-loop, then you could try converting the structure to a cell array and then using a cell function. An example would look something like this:
idx = cellfun(@length,struct2cell(STRUC(:)))>100
idx =
1 0 0 1

类别

Help CenterFile Exchange 中查找有关 Structures 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by