【发布时间】: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。
有什么建议吗?
【问题讨论】:
-
请考虑接受以下答案之一。就目前而言,这个问题似乎没有答案。谢谢! =)
我想在我的矩阵中找到 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。
有什么建议吗?
【问题讨论】:
如果向量很大,对矩阵(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
【讨论】:
A = S 行的原因,以确保保留原始向量。也许我应该调用进行更改的向量A_temp 并保持原始不变,但是... =)
[min_val, idx] = min(A(:));
类似这样的:
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)
【讨论】: