例如,我创建了一个类"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 ) );