2012-01-20 55 views
7

Tôi muốn làm những gì GROUP BY của SQL làm trong MATLAB. Ví dụ:GROUP BY trong MATLAB

M = [
1, 5;
2, 5;
3, 5;
1, 6;
2, 6;
1,7]

SQL: SELECT MAX (c1), c2 TỪ M (c1, c2) GROUP BY 2

Result = [
3, 5;
2, 6;
1, 7]

Làm cách nào tôi có thể thực hiện việc này trong Matlab?

+1

Tôi giả định quãng tám sẽ có accumarray. Nếu không, sẽ không khó để có được kết quả bằng cách lặp qua các giá trị 'duy nhất' của' M (:, 1) ' –

Trả lời

4

grpstats trong kê Toolbox có thể làm điều này:

>> [grpstats(M(:,1), M(:,2), {'max'}) unique(M(:,2))] 

ans = 

    3  5 
    2  6 
    1  7 
+0

Ngoài ra, nếu dữ liệu của bạn nằm trong một tập dữ liệu mảng (cũng từ hộp công cụ thống kê), định dạng đầu ra của' grpstats' là đẹp hơn và tự động. Xem tại đây: http://www.mathworks.com/help/toolbox/stats/dataset.grpstats.html –

+1

Thực ra, tôi đang sử dụng Octave, không có chức năng này. Bạn có biết nếu tôi có thể cài đặt nó như là plugin? Bạn có biết giải pháp thay thế không? – Gjorgji

+0

Bạn có thể sử dụng mã mẫu từ http://www.orient-lodge.com/node/3732 – itamarb

2

Tôi nghĩ rằng có một giải pháp đơn giản cho việc này. Dưới đây là những gì tôi đã kiểm tra trên Matlab và nó làm việc:

>> M = [ 
1, 5; 
2, 5; 
3, 5; 
1, 6; 
2, 6; 
1,7 ]; 

>> grpstats(M,M(:,2),{'max'}) 

ans = 

    3  5 
    2  6 
    1  7 
3

Nếu bạn không nhớ làm một số tiền xử lý để có được thứ tự (hoặc nếu cột đầu tiên là độc đáo được xây dựng 1-n), bạn có thể làm nó như thế này:

accumarray([1 2 3 1]',[11 12 13 14]',[],@max) 

này sẽ cung cấp:

14 
12 
13 

Hoặc trong trường hợp của bạn:

01.235.
accumarray(M(:,1),M(:,2),[],@max) 

Lưu ý đơn đặt hàng. Ví dụ, số thứ hai, sẽ tương ứng với M(:,1) == 2