A
是3D(X,Y,Z)中的一系列点坐标,例如:
>> A = [1 2 0;3 4 7;5 6 9;9 0 5;7 8 4]
A =
1 2 0
3 4 7
5 6 9
9 0 5
7 8 4
我想根据"Y" (second column)
值对矩阵进行排序。
以下是我正在使用的代码:
>> tic;[~, loc] = sort(A(:,2));
SortedA = A(loc,:)
toc;
SortedA =
9 0 5
1 2 0
3 4 7
5 6 9
7 8 4
Elapsed time is **0.001525** seconds.
但是,对于大量数据,它可能会非常慢。如果有人知道更有效的方法,我将不胜感激。
答案 0 :(得分:2)
MATLAB确实有一个名为sortrows()
的功能来实现这一点,但根据我的经验,它往往与你为一般非结构化矩阵所做的一样慢。
测试:
N = 1e4;
A = rand(N,N);
tic;[~, loc] = sort(A(:,2));
SortedA = A(loc,:);
toc;
tic; sortrows(A,2); toc;
给出:
Elapsed time is 0.515903 seconds.
Elapsed time is 0.525725 seconds.
答案 1 :(得分:2)
这个答案主要讨论如何利用计算效率GPU
来解决所述问题。该问题中提出的问题的解决方案代码是 -
[~, loc] = sort(A(:,2));
SortedA = A(loc,:);
基本上有两个部分 -
现在,Part 1
是计算密集型的,可以移植到GPU
,但Part 2
是索引工作,可以在CPU
本身上完成。
因此,考虑到所有这些,一个有效的GPU
解决方案将是 -
gA = gpuArray(A(:,2)); %// Port only the second column of input matrix to GPU
[~, gloc] = sort(gA); %// compute sorted indices on GPU
SortedA = A(gather(gloc),:); %// get the sorted indices back to CPU with `gather`
%// and then use them to get sorted A
接下来是将GPU
版本与原始解决方案进行比较的基准代码,但请记住,因为我们在不同的硬件上运行GPU
代码与原始解决方案相比在CPU
上运行的基准测试结果可能因系统而异。
这是基准代码 -
N = 3000000; %// datasize (number of rows in input)
A = rand(N,3); %// generate random large input
disp('------------------ With original solution on CPU')
tic
[~, loc] = sort(A(:,2));
SortedA = A(loc,:);
toc, clear SortedA loc
disp('------------------ With proposed solution on GPU')
tic
gA = gpuArray(A(:,2));
[~, gloc] = sort(gA);
SortedA = A(gather(gloc),:);
toc
以下是基准测试结果 -
------------------ With original solution on CPU
Elapsed time is 0.795616 seconds.
------------------ With proposed solution on GPU
Elapsed time is 0.465643 seconds.
所以,如果你有足够的GPU
,那么现在是时候尝试GPU
来排序相关的问题,而MATLAB提供这样简单的GPU
移植解决方案更是如此。
MATLAB Version: 8.3.0.532 (R2014a)
Operating System: Windows 7
RAM: 3GB
CPU Model: Intel® Pentium® Processor E5400 (2M Cache, 2.70 GHz)
GPU Model: GTX 750Ti 2GB
答案 2 :(得分:1)
尝试sortrows
,指定第2列:
Asorted = sortrows(A,2)
更简单,但实际上我现在测试得慢了......如果您只考虑1列进行排序,显然sortrows
并不是那么好。当您按特定顺序考虑多个列时,它可能是最佳的。