如何找到矩阵中最小值的确切数量? [复制]

Posted

技术标签:

【中文标题】如何找到矩阵中最小值的确切数量? [复制]【英文标题】:How to find exact number of minimum values in matrix? [duplicate] 【发布时间】:2015-01-14 05:58:10 【问题描述】:

我想在我的矩阵中找到 3 个最小值。

例如:

7 7 11 5 6
8 9 6 3 2 
10 15 8 3 4
12 9 6 8 11

3 个最小值:2,3,4。

有什么建议吗?

【问题讨论】:

请考虑接受以下答案之一。就目前而言,这个问题似乎没有答案。谢谢! =) 【参考方案1】:

如果向量很大,对矩阵(O(n*log n)) 进行排序可能比进行三个线性搜索(O(n)) 花费更多时间。所以这样的事情实际上可能比排序数组并选择前三个值更快。

在我的计算机上,这种方法在大于 1000-3000 个元素的向量上速度更快。

num_vals = 3
vals = zeros(num_vals,1);
for k = 1:3
   [min_val, idx] = min(A);
   vals(ii) = min_val;
   A(idx) = NaN;
end

举例说明:

A = rand(1e6,1);
S = A;

%% Linear search:
tic
for ii = 1:10
A = S;
num_vals = 3;
vals = zeros(num_vals,1);
for ii = 1:3
   [min_val, idx] = min(A);
   vals(ii) = min_val;
   A(idx) = NaN;
end
end
t1 = toc
A = S;

%% Sorting first:
tic
for ii = 1:10
   As = sort(A(:),'ascend');
   vals2 = As(1:3);
end
t2 = toc
isequal(vals, vals2)

t1 =
     0.0661
t2 =
     0.4781

ans =
     1

【讨论】:

请记住,您正在使用此解决方案更改 vals - 如果 vals 是输入,则在这种情况下更改它会导致生成副本。或许 OP 不介意,但要考虑一些事情。 感谢您关注@siliconwafer。 =) 这也是A = S 行的原因,以确保保留原始向量。也许我应该调用进行更改的向量A_temp 并保持原始不变,但是... =) @OP:我刚刚注意到(在编辑时)你有一个矩阵,而不是最初看起来的向量。那你需要做:[min_val, idx] = min(A(:));【参考方案2】:

类似这样的:

nrItems = 3;
yourAr  = [ 7 7 11 5 6 8 9 6 3 2 10 15 8 3 4 12 9 6 8 11 ];
sortAr  = sort(yourAr, 'ascend');


vals    = sort(1:nrItems)

【讨论】:

以上是关于如何找到矩阵中最小值的确切数量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在矩阵中查找最小值的索引

如何在 ListBox 中查找最小重复值的索引?

NumPy:在子矩阵/块和相应的行、列索引中找到最小值

查找列表中最小数字的索引值? [复制]

如何在numpy矩阵中找到最小值?

最小(x,y)对值的Matlab矩阵索引