2

我有一个数组,如此处所示。这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)获得该值。我想找出 , , 中哪个b1最大b2并且b3需要mean_val获取它的索引。(见上面的python代码。如果b2有最高的mean_val,那么最后,j将包含索引2。)

4

1 回答 1

1

arrayfun将函数应用于数组的每个元素。它会生成一个包含操作结果的新数组。对于此结果,您可以max照常申请:

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

subsref请注意,如果您重载了类的orsize方法,这可能不起作用Bandit


编辑:

所以现在我明白这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将提取mean结构数组的每个元素的值,产生一个逗号分隔的列表。该列表使用方括号捕获以形成向量。这个向量像往常一样再次输入到max函数中。

我不确定后一种解决方案是否也适用于自定义类。我没有你的Bandit课要考。请让我知道后一种解决方案是否有效,以便我可以使用正确的信息更新帖子。

于 2018-04-11T20:59:24.670 回答