如何在数组中找到具有特定属性值的对象的索引



例如,我创建了一个类"student">

classdef student
properties
name
sex
age
end
methods
function obj = student(name,sex,age)
obj.name = name;
obj.sex = sex;
obj.age = age;
end
end

然后在数组"学校"中创建一些对象

school(1)=student(A,'boy',19)
school(2)=student(B,'girl',18)
school(3)=student(C,'boy',20)
school(4)=student(D,'girl',19)

我的问题是如何找到数组"school"中具有某些属性的对象的索引?

例如,如果我想找到19岁的学生,结果将是指数[1,4]

如果我想找到19岁和性别为"男孩"的学生,结果将是指数[1]

进一步的问题1:如何找到行和列索引?性别为"女孩"且年龄为19岁的对象位于第1排第4列。

进一步的问题2:如果学校是一个单元阵列,如何解决上述问题?

看起来像是家庭作业题。然而,以下是答案:

% find students with age 19,
find (  [school(:).age] == 19 )
% find students with age 19 and sex 'boy', 
find (  [school(:).age] == 19 & strcmp( { school(:).sex }, 'boy'   ) )
% how to find the row and colume index? 
[row, col] = ind2sub( size(school), find (  [school(:).age] == 19 & strcmp( { school(:).sex }, 'girl'   ) ) )

考虑到最后一个问题,我会将学校对象的单元格转换回数组,并按照上面所示的方式进行操作。

如果school是一个单元阵列,则您有

school = cell(4,1);
school{1}=student(A,'boy',19)
school{2}=student(B,'girl',18)
school{3}=student(C,'boy',20)
school{4}=student(D,'girl',19)

然后你可以循环浏览它们来评估你的状况。一种简洁的方法是使用cellfun:

boolAge19 = cellfun( @(x) x.age == 19, school );
idxAge19  = find( boolAge19 );
boolBoy   = cellfun( @(x) strcmp( x.sex, 'boy' ), school );
idxBoy    = find( boolBoy );
boolBoyAnd19 = boolAge19 & boolBoy;
idxBoyAnd19  = find( boolBoyAnd19 );

你当然可以跳过中间的步骤,线条只是得到密集的

idxBoyAnd19 = find( cellfun( @(x) x.age == 19, school ) & ...
cellfun( @(x) strcmp( x.sex, 'boy' ), school ) );

相关内容

  • 没有找到相关文章

最新更新