我有一个多维最大化问题。 (让我们说)有一个州和两个控制变量(分别为x1
和x2
,x3
):对于状态变量x1
的每个值,我们通过改变x2
和x3
来最大化一些目标函数。
在Matlab中,我有一个三维数组,让我们称之为F
,第一维x1
和x2
,{{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)
答案 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
)及其在第二维和第三维(z2
,z3
)中的位置。
对于三个以上的维度,如果要对每个第一维切片进行最大化,则推广很容易:
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}
是z2
,z{2}
是z3
等。