根据X,Y或Z值对点云的坐标进行排序

时间:2014-11-04 20:31:37

标签: arrays performance matlab sorting

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.

但是,对于大量数据,它可能会非常慢。如果有人知道更有效的方法,我将不胜感激。

3 个答案:

答案 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,:);

基本上有两个部分 -

  1. 选择第二列,对它们进行排序并获取已排序的索引。
  2. 使用已排序的索引将输入矩阵行索引。
  3. 现在,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并不是那么好。当您按特定顺序考虑多个列时,它可能是最佳的。