Kelompokkan nilai di baris berbeda berdasarkan indeks kolom pertamanya

Pertanyaan ini merupakan hasil dari MatLab (atau bahasa lainnya) untuk mengonversi matriks atau csv untuk meletakkan nilai kolom ke-2 ke baris yang sama jika nilai kolom ke-1 sama?

If

      A = [2 3 234 ; 2 44 33; 2 12 22; 3 123 99; 3 1232 45; 5 224 57]

kolom 1 | kolom ke-2 | kolom ke-3

2             3          234
2             44         33
2             12         22
3             123        99
3             1232       45
5             224        57

lalu berlari

    [U ix iu] = unique(A(:,1) ); 
    r= accumarray( iu, A(:,2:3), [], @(x) {x'} )

akan menunjukkan kesalahannya kepada saya

    Error using accumarray
    Second input VAL must be a vector with one element for each row in SUBS, or a
    scalar.

saya ingin membuat

kolom pertama | kolom ke-2 | kolom ke-3 | kolom ke-4 | kolom ke-5 | kolom ke-6| kol ke-7

2         3        234       44        33        12        22
3         123      99        1232      45
5         224      57

Saya tahu bagaimana melakukannya menggunakan for dan if, tapi itu menghabiskan terlalu banyak waktu untuk data besar.

Bagaimana saya bisa melakukan ini?

Terima kasih sebelumnya!


person user1849133    schedule 03.07.2013    source sumber


Jawaban (1)


Anda menyalahgunakan accumarray dalam solusi yang diberikan pada pertanyaan Anda sebelumnya. Parameter pertama iu adalah vektor indeks dan parameter kedua harus berupa vektor nilai dengan panjang yang sama. Apa yang Anda lakukan di sini adalah menentukan matriks sebagai parameter kedua, yang sebenarnya memiliki nilai dua kali lebih banyak daripada indeks di iu.

Apa yang perlu Anda lakukan untuk membuatnya berfungsi adalah membuat vektor indeks untuk kolom kedua dan kolom ketiga (keduanya adalah indeks yang sama, bukan secara kebetulan!) dan tentukan vektor nilai kolom yang cocok, seperti:

[U, ix, iu] = unique(A(:,1));
vals = reshape(A(:, 2:end).', [], 1);                    %'// Columnize values
subs = reshape(iu(:, ones(size(A, 2) - 1, 1)).', [], 1); %'// Replicate indices
r = accumarray(subs, vals, [], @(x){x'});

Solusi ini digeneralisasikan untuk sejumlah kolom yang ingin Anda teruskan ke accumarray.

person Eitan T    schedule 03.07.2013
comment
Solusi Anda luar biasa! Terima kasih banyak! - person user1849133; 04.07.2013
comment
@Eitan_T Ya, saya memilih jawaban Anda. Saya tidak mengklik tombol atas setelah saya mendapat pesan Anda tidak dapat memilih kecuali Anda mencapai reputasi 15 tetapi sekarang saya dapat memilih karena reputasi saya lebih dari 15. Terima kasih telah mengingatkan saya :) - person user1849133; 04.07.2013
comment
@Eitan_T Saya melihat perbedaan antara yang saya inginkan dan kode Anda. Saya mencoba tetapi saya tidak bisa mendapatkan tabel keluaran yang saya tulis. Kode Anda sepertinya memberi saya penataan ulang kolom demi kolom. Tapi tujuan saya adalah menata ulang baris demi baris. Saya mencoba beberapa perubahan tetapi gagal. Mungkin saya harus mempelajari accumarray lebih banyak. Bisakah Anda memberi saya solusi sederhana untuk ini? - person user1849133; 04.07.2013
comment
@Eitan_T Yang saya dapatkan adalah r{1}=3 44 12 22 33 234, r{2}=1232 123 99 45, r{3}= 57 224, jadi urutannya berbeda. - person user1849133; 07.07.2013
comment
@Eitan_T Cukup aneh :( Mungkin versi Matlab yang berbeda melakukan hal yang berbeda? Sulit untuk menemukan alasannya. Untuk mengetahui masalahnya, saya akan melaporkan kepada Anda semua variabel yang saya dapatkan. - person user1849133; 07.07.2013
comment
@Eitan_T U= 2 3 5 (dalam vektor kolom), ix=3 5 6 (dalam vektor kolom), iu= 1 1 1 2 2 3 (dalam vektor kolom), vals = 3 44 12 123 1232 224 234 33 22 99 45 57, subs = 1 1 1 2 2 3 1 1 1 2 2 3 - person user1849133; 07.07.2013
comment
@ user1849133 Oh, saya mengerti maksud Anda. Saya telah mengubah jawaban saya. - person Eitan T; 07.07.2013
comment
@Eitan_T Saya minta maaf terlambat membalas. Solusi Anda berhasil! Terima kasih! - person user1849133; 15.07.2013
comment
@ user1849133 Luar biasa! - person Eitan T; 15.07.2013
comment
@Eitan_T Saya memposting perkembangan dari pertanyaan ini di stackoverflow.com/questions/17667224/ Bisakah Anda mengetahui cara melakukannya? Tentu saja saya akan lebih memperhatikan jawaban Anda daripada jawaban orang lain :) - person user1849133; 16.07.2013