我有一个数组如此处所示。这里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.)
答案 0 :(得分:1)
arrayfun
将函数应用于数组的每个元素。它会产生一个包含操作结果的新数组。然后,您可以像往常一样应用max
:
[~,arg] = max(arrayfun(@mean,bandits));
请注意,如果您为subsref
类重载size
或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
将为struct数组的每个元素提取mean
值,从而产生逗号分隔的列表。使用方括号捕获此列表以形成向量。该矢量再次像往常一样输入max
函数。
我不确定后一种解决方案是否也适用于自定义类。我没有你的Bandit
课程来测试。如果后一种解决方案有效,请告诉我,以便我可以用正确的信息更新帖子。