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

w6lpcovy  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(177)

例如,我创建了一个名为‘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’

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岁的学生,结果将是index[1,4]
如果我想要找到年龄为19岁,性别为‘男孩’的学生,结果将是索引[1]
进一步的问题1:如何找到行和列索引?性别为‘女孩’、年龄为19岁的对象位于第一列第四列。
进一步的问题2:如果学校是一个细胞阵列,如何解决以上问题?

qlvxas9a

qlvxas9a1#

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

% 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对象的单元格转换回一个数组,并执行上面所示的操作。

ncgqoxb0

ncgqoxb02#

如果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 ) );

相关问题