จะหาผลรวมของค่าทั้งหมดใน int[][] Java ได้อย่างไร?

ฉันมีอาร์เรย์จำนวนเต็ม 'int พิกเซล[] []'

และฉันต้องการหาผลรวมทั้งหมดเพื่อที่จะหาค่าพิกเซลเฉลี่ยได้

สิ่งนี้จะถูกใช้เพื่อให้ฉันสามารถตั้งค่าเฉลี่ยของพิกเซลให้เป็นค่าเกณฑ์สำหรับรูปภาพ pbm

หากค่าหากสูงกว่าเกณฑ์ ฉันจะส่งออกพิกเซลสีขาว หากต่ำกว่า ฉันจะส่งออกพิกเซลสีดำ (เพื่อให้บริบทบางส่วน)

ฉันคิดว่าโค้ดด้านล่างไม่ถูกต้องเลยเนื่องจากเอาต์พุตเป็น 6.0 แต่ฉันคิดว่ามันประมาณนี้

   double threshold = 0;
   for(int i = 0; i < pixels.length; i++)
   {
       threshold += (double)pixels[i][i];
   }
   System.out.print(threshold);

person AngryDuck    schedule 20.02.2013    source แหล่งที่มา
comment
วนซ้ำทุกแถว และวนซ้ำทุกเซลล์เพื่อเพิ่มทั้งหมด คุณต้องมีลูปที่ซ้อนกันเพื่อสิ่งนั้น   -  person jlordo    schedule 20.02.2013
comment
คุณสามารถใช้ 2 ลูปที่ซ้อนกันเพื่อเข้าถึงองค์ประกอบทั้งหมด   -  person Henry    schedule 20.02.2013


คำตอบ (5)


คุณต้องการวนซ้ำตัวเลขทั้งหมดในอาร์เรย์หรือไม่ คุณสามารถลองทำเช่นนี้:

           double threshold = 0;
           for(int i = 0; i < pixels.length; i++)
           {
               for(int j=0;j<pixels[i].length;j++){
                   threshold += (double)pixels[i][j];
               }
           }
           System.out.print(threshold);
person Jason    schedule 20.02.2013
comment
ขอบคุณ ฉันเพิ่งรู้เรื่องนี้ทันทีที่โพสต์ (จะช่วยพิมพ์หรือพูดถึงปัญหาเสมอ ปกติจะพบว่าคำตอบเดียวเท่านั้นที่ได้ผล) ยังไงก็ตามคุณพูดถูก ดังนั้นฉันจะยอมรับคำตอบ - person AngryDuck; 20.02.2013
comment
@ user1110338 - หากนี่คือคำตอบที่ถูกต้องสำหรับคำถามของคุณ ให้ทำเครื่องหมายดังกล่าวไม่ว่าคุณจะแก้ไขด้วยตัวเองหรือไม่ก็ตาม - person webnoob; 20.02.2013

คำใบ้

คุณมีอาร์เรย์ 2 มิติ ดังนั้นหากต้องการเพิ่มแต่ละองค์ประกอบ คุณจะต้องสำรวจแต่ละคอลัมน์ของแต่ละแถว สำหรับ 2 for loops นี้อาจมีประโยชน์บ้าง

ข้ามแต่ละค่าแล้วบวกเข้าไป

วงออก

หารผลรวมของคุณด้วยจำนวนองค์ประกอบเพื่อให้ได้ค่าเฉลี่ย (คุณอาจต้องคิดบางอย่างเพื่อพิมพ์การคัดเลือกที่นี่)

person Mukul Goel    schedule 20.02.2013

คุณต้องวนซ้ำแต่ละแถวและคอลัมน์ในอาร์เรย์ ดังนั้นคุณจึงต้องมี for-loop 2 ตัว สิ่งที่คุณกำลังทำอยู่ในปัจจุบันครอบคลุมเฉพาะสิ่งต่อไปนี้: (0,0), (1,1), (2,2), ...

สิ่งนี้จะได้ผล: (สมมติว่าเป็นอาร์เรย์ที่ไม่มีรอยหยัก อย่างน้อยก็สำหรับการคำนวณเกณฑ์)

long sum = 0;
for (int i = 0; i < pixels.length; i++)
for (int j = 0; j < pixels[i].length; j++)
{
   sum += pixels[i][j];
}
double threshold = (double)sum / (pixels.length * pixels[0].length);
System.out.print(threshold);

หรือมากกว่านั้นง่ายๆ: (สมมติว่าเป็นอาร์เรย์ที่ไม่มีรอยหยัก อย่างน้อยก็สำหรับการคำนวณเกณฑ์)

long sum = 0;
for (int[] i: pixels)
for (int j: i)
{
   sum += j;
}
double threshold = (double)sum / (pixels.length * pixels[0].length);
System.out.print(threshold);
person Bernhard Barker    schedule 20.02.2013

คุณต้องใช้ for สองครั้งที่นี่ บางอย่างเช่นนี้:-

for(int i = 0; i < pixels.length; i++){
        for(int i = 0; i < pixels[i].length; i++){
               threshold += (double)pixels[i][j];
        }
}
person RainMaker    schedule 20.02.2013
comment
+ = ไม่ใช่ตัวดำเนินการ += คือ - person jlordo; 20.02.2013
comment
ฉันเอา -1 กลับคืนมาเมื่อคุณลบข้อผิดพลาดออก ฉันแนะนำให้คุณเขียนโค้ดใน IDE ของคุณแล้วคัดลอก/วางคำตอบของคุณที่นี่ วิธีนี้จะป้องกันข้อผิดพลาดของคอมไพเลอร์ดังกล่าว - person jlordo; 20.02.2013

คุณไม่จำเป็นต้องเพิ่มสองเท่าเมื่อคุณนับผลรวมของ ints นี่เป็นการสิ้นเปลือง ใช้นาน และเร็วกว่า

    long sum = 0;
    int n = 0;
    for (int[] a : pixels) {
        for (int e : a) {
            sum += e;
            n++;
        }
    }
    double avg = ((double) sum) / n;
person Evgeniy Dorofeev    schedule 20.02.2013
comment
การเพิ่มประสิทธิภาพเล็กน้อย: n += a.length; ก่อนวงใน ;) - person jlordo; 20.02.2013