จัดกลุ่มค่าในแถวต่างๆ ตามดัชนีคอลัมน์แรก

คำถามนี้เป็นผลพลอยได้จาก MatLab (หรือภาษาอื่น ๆ) เพื่อแปลงเมทริกซ์หรือ csv เพื่อใส่ค่าคอลัมน์ที่ 2 ลงในแถวเดียวกันหากค่าคอลัมน์ที่ 1 เหมือนกัน

If

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

คอลัมน์ที่ 1 | คอลัมน์ที่ 2 | คอลัมน์ที่ 3

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

จากนั้นก็วิ่ง

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

จะแสดงข้อผิดพลาดให้ฉันดู

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

ฉันต้องการที่จะทำให้

สีที่ 1 | สีที่ 2 | สีที่ 3 | สีที่ 4 | สีที่ 5 | คอที่ 6| พ.อ. 7

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

ฉันรู้วิธีการใช้ for และ if แต่นั่นใช้เวลานานเกินไปสำหรับ big data

ฉันจะทำเช่นนี้ได้อย่างไร?

ขอบคุณล่วงหน้า!


person user1849133    schedule 03.07.2013    source แหล่งที่มา


คำตอบ (1)


คุณใช้ accumarray ในทางที่ผิดในวิธีแก้ปัญหาที่ให้ไว้สำหรับคำถามก่อนหน้าของคุณ พารามิเตอร์ตัวแรก iu คือเวกเตอร์ของดัชนี และพารามิเตอร์ตัวที่สองควรเป็นเวกเตอร์ของค่าที่มีความยาวเท่ากัน สิ่งที่คุณทำที่นี่คือระบุเมทริกซ์เป็นพารามิเตอร์ตัวที่สอง ซึ่งจริงๆ แล้วมีค่ามากกว่าดัชนีใน iu ถึงสองเท่า

สิ่งที่คุณต้องทำเพื่อให้มันใช้งานได้คือสร้างเวกเตอร์ของดัชนีทั้งสำหรับคอลัมน์ที่สองและคอลัมน์ที่สาม (เป็นดัชนีเดียวกัน ไม่ใช่โดยบังเอิญ!) และระบุเวกเตอร์คอลัมน์ที่ตรงกันของค่า เช่น:

[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'});

โซลูชันนี้เป็นแบบทั่วไปสำหรับคอลัมน์จำนวนเท่าใดก็ได้ที่คุณต้องการส่งผ่านไปยัง accumarray

person Eitan T    schedule 03.07.2013
comment
ทางออกของคุณเยี่ยมมาก! ขอบคุณมาก! - person user1849133; 04.07.2013
comment
@Eitan_T ใช่ฉันโหวตคำตอบของคุณ ฉันไม่ได้คลิกปุ่มขึ้นหลังจากที่ฉันได้รับข้อความว่า คุณไม่สามารถโหวตได้เว้นแต่คุณจะถึงชื่อเสียงที่ 15 แต่ตอนนี้ฉันสามารถโหวตได้เนื่องจากชื่อเสียงของฉันมีมากกว่า 15 ขอบคุณที่เตือนฉัน :) - person user1849133; 04.07.2013
comment
@Eitan_T ฉันสังเกตเห็นความแตกต่างระหว่างสิ่งที่ฉันต้องการกับรหัสของคุณ ฉันพยายามแล้ว แต่ไม่สามารถรับตารางผลลัพธ์ที่ฉันเขียนได้ ดูเหมือนว่ารหัสของคุณให้ฉันจัดเรียงใหม่ทีละคอลัมน์ แต่จุดประสงค์ของฉันคือการจัดเรียงใหม่ทีละแถว ฉันลองเปลี่ยนแปลงบางอย่างแต่ล้มเหลว บางทีฉันอาจจะต้องศึกษาเรื่องสะสมให้มากขึ้น คุณช่วยแก้ไขง่ายๆ สำหรับสิ่งนี้ให้ฉันได้ไหม - person user1849133; 04.07.2013
comment
@Eitan_T สิ่งที่ฉันได้รับคือ r{1}=3 44 12 22 33 234, r{2}=1232 123 99 45, r{3}= 57 224 ดังนั้นลำดับจึงแตกต่าง - person user1849133; 07.07.2013
comment
@Eitan_T ค่อนข้างแปลก :( บางที Matlab เวอร์ชันที่แตกต่างกันอาจทำสิ่งที่แตกต่างกันได้ มันยากที่จะหาเหตุผล เพื่อค้นหาว่าปัญหาคืออะไร ฉันจะรายงานตัวแปรทั้งหมดที่ฉันได้รับให้คุณทราบ - person user1849133; 07.07.2013
comment
@Eitan_T U= 2 3 5 (ในเวกเตอร์คอลัมน์), ix=3 5 6 (ในเวกเตอร์คอลัมน์), iu= 1 1 1 2 2 3 (ในเวกเตอร์คอลัมน์), vals = 3 44 12 123 1232 224 234 33 22 99 45 57 ผู้ติดตาม = 1 1 1 2 2 3 1 1 1 2 2 3 - person user1849133; 07.07.2013
comment
@ user1849133 โอ้ ฉันเข้าใจสิ่งที่คุณหมายถึง ฉันได้แก้ไขคำตอบของฉันแล้ว - person Eitan T; 07.07.2013
comment
@Eitan_T ฉันขอโทษที่ตอบช้า โซลูชันของคุณใช้งานได้! ขอบคุณ! - person user1849133; 15.07.2013
comment
@user1849133 เยี่ยมมาก! - person Eitan T; 15.07.2013
comment
@Eitan_T ฉันโพสต์ผลพลอยได้ของคำถามนี้ที่ stackoverflow.com/questions/17667224/ คุณช่วยทราบวิธีดำเนินการได้ไหม แน่นอนว่าฉันมักจะให้ความสำคัญกับคำตอบของคุณมากกว่าคำตอบของผู้อื่น :) - person user1849133; 16.07.2013