在Matlab中获取数组的argmax的完整坐标

时间:2014-05-01 18:45:26

标签: arrays matlab optimization indexing

我有一个多维最大化问题。 (让我们说)有一个州和两个控制变量(分别为x1x2x3):对于状态变量x1的每个值,我们通过改变x2x3来最大化一些目标函数。

在Matlab中,我有一个三维数组,让我们称之为F,第一维x1x2,{{1在后一个维度中。

获得最大值很简单 - 只需设置: x3; 这将返回每个F_star=max(max(F,[],2),[],3)的最大长度N_1向量。

我的问题是获取最大化器的索引/坐标。

我的第一个猜测是使用扩展函数调用:

x1

但是,这仅适用于OUTERMOST [F_star, maximizers]=max(max(F,[],2),[],3);函数,因此只返回第三维中的最大化索引。

当然,人们可以重复这一点并置换维度:

max

[F_star, maximizers_3]=max(max(F,[],2),[],3);

但是最大限度地使用两倍似乎没有效率(这对我的实际问题很重要,因为实际上有3个控制变量和7个状态变量,所以搜索整个数组是一个很大的负担。)

有关提取所有坐标或索引的简单方法的想法吗?

具体而言,这是一个简单的例子:

[F_star, maximizers_2]=max(max(F,[],3),[],2);

结合F = 10*rand(2,2,2) [y, z3] = max(max(F,[],2),[],3) [y, z2] = max(max(F,[],3),[],2) F(:,:,1) = 2.1203 9.1380 0.7735 7.0672 F(:,:,2) = 5.5779 1.6620 3.1343 6.2250 y = 9.1380 7.0672 z3 = 1 1 y = 9.1380 7.0672 z2 = 2 2 & z2,我们得到了我们想要的东西: z3的第一个值(即x1)中的最大值为9.1,发生在F(1,:,:)

(z2(1),z3(1)) -- F(1,z2(1),z3(1))=F(1,2,1)的第一个值(即x2中)的最大值为7.1,发生在F(2,:,:)

拥有以下内容会很棒: (z2(2),z3(2)) -- F(1,z2(2),z3(2))=F(2,2,1)

1 个答案:

答案 0 :(得分:1)

“线性化”(组合)第二和第三维reshape;从组合维度得到最大化器的线性指数;并使用ind2sub转换为两个子索引:

[F_star ind] = max(reshape(F, size(F,1), []), [], 2);
[z2 z3] = ind2sub([size(F,2) size(F,3)], ind);

对于每个第一维切片,这将为您提供最大值(F_star)及其在第二维和第三维(z2z3)中的位置。


对于三个以上的维度,如果要对每个第一维切片进行最大化,则推广很容易:

s = size(F);
[F_star ind] = max(reshape(F, s(1), []), [], 2);
z = cell(1,numel(s)-1);
[z{:}] = ind2sub(s(2:end), ind);

位置在单元格数组z中给出,z{1}z2z{2}z3等。