(Matlab) 使用 min 函数返回的索引进行维度索引

Posted

技术标签:

【中文标题】(Matlab) 使用 min 函数返回的索引进行维度索引【英文标题】:(Matlab) Dimensional indexing using indices returned by min function 【发布时间】:2014-06-12 20:26:02 【问题描述】:

假设我有一个 5 维矩阵 C,我使用下面的代码得到一个最小矩阵 C3(C3 的每个元素代表维度 1,2,3 的最小值):

[C1, I1] = min(C,[],1);
[C2, I2] = min(C1, [], 2);
[C3, I3] = min(C2, [], 3);

问题是如何得到每个维度的最小值的索引?例如考虑这个更简单的情况:

C = [1,2;3,4]

这里的最小值是 1,它在维度 1 中的索引是 1(第一行),在维度 2 中也是 1(第一列)。

我知道改变这些表达式的顺序会给我正确的答案,但是如果我想通过只计算一次这些表达式来获得所有维度索引呢?

【问题讨论】:

第一个分钟(取决于输入矩阵的大小)返回索引向量,而不是数字。这不是整行或整列。这个向量是每一行中的最小数字,收集到一个向量中。 【参考方案1】:

将其用于 5D 矩阵 -

[~,ind] = min(C(:))
[ind_dim1,ind_dim2,ind_dim3,ind_dim4,ind_dim5] = ind2sub(size(C),ind)

编辑 1:这适用于您不完全在寻找全局但特定于维度的最小值和索引的情况。

代码

%%// Random data for demo
C = randi(60,2,3,4,2,3);

%%// Your method
[C1, I1] = min(C,[],1)
[C2, I2] = min(C1, [], 2)
[C3, I3] = min(C2, [], 3)

%%// My method
dimID = 3; %%// Dimension till when minimum is to be found out
C_size = size(C);
dim_v1 = prod(C_size(1:dimID))
dim_v2 = prod(C_size(1:dimID-1))

t1 = reshape(C,[dim_v1 C_size(dimID+1:end)])
[val,ind1] = min(t1,[],1)
chk1_ind = ceil(ind1/dim_v2)

%%// This might suffice for you, but you insist to get the indices in the format 
%%// identical to the one obtained from your method, try the next steps

C_size(1:dimID)=1;
chk2_ind = reshape(chk1_ind,C_size)

%%// Verify
error_check = isequal(chk2_ind,I3)

【讨论】:

所以我不是在计算全局最小值,而是我只想要某些维度的最小值。有什么方便的方法吗? @user3577923 只是为了让我们清楚,也许可以取一些样本输入值并向我们展示所需的输出?一些示例 3D 或 4D 输入? @user3577923 查看编辑 1!请注意,我们只使用一次minchk1_indchk2_ind 是我猜的你。

以上是关于(Matlab) 使用 min 函数返回的索引进行维度索引的主要内容,如果未能解决你的问题,请参考以下文章

matlab基本函数min

在 Julia 中返回数组中的最小索引

Matlab - 各种函数学习

pandas使用argmin函数返回给定series对象中最小值(minminimum)的行索引实战

matlab基本函数find

matlab中常用的函数