MATLAB相当于带有用户定义对象数组的Python argmax

时间:2018-04-11 20:40:59

标签: matlab class object argmax

我有一个数组如此处所示。这里Bandit是我创建的一个类。

bandits = [Bandit(m1),Bandit(m2),Bandit(m3)];

现在,我想做以下事情。以下是Python代码,它立即给出了每个对象的平均值的maxarg。

j = np.argmax([b.mean for b in bandits])

我怎样才能在MATLAB中做同样的事情?为了更清晰,每个强盗对象都有一个属性mean_value。即如果b1是强盗对象,那么我可以使用点运算符(b1.mean_value)获得该值。我想找到b1b2b3中哪个最大mean_val并且需要为其获取索引。 (参见上面的python代码。如果b2具有最高mean_val,那么最后,j将包含索引2.)

1 个答案:

答案 0 :(得分:1)

arrayfun将函数应用于数组的每个元素。它会产生一个包含操作结果的新数组。然后,您可以像往常一样应用max

[~,arg] = max(arrayfun(@mean,bandits));

请注意,如果您为subsref类重载sizeBandit方法,则可能无效。

修改

所以现在我明白mean不是函数而是属性。操作x.mean可以表示为函数调用subsref(x,substruct('.','mean'))。因此,可以更改上面的解决方案,在每个数组元素上调用此函数:

op = @(x)subsref(x,substruct('.','mean'))
[~,arg] = max(arrayfun(op,bandits));

也就是说,我们不是调用函数mean,而是调用函数subsref来索引属性mean

如果bandits是一个简单的结构数组,那么以下内容也适用:

[~,arg] = max([bandits.mean]);

这里,bandits.mean将为struct数组的每个元素提取mean值,从而产生逗号分隔的列表。使用方括号捕获此列表以形成向量。该矢量再次像往常一样输入max函数。

我不确定后一种解决方案是否也适用于自定义类。我没有你的Bandit课程来测试。如果后一种解决方案有效,请告诉我,以便我可以用正确的信息更新帖子。