一維陣列與二維陣列轉換
這是我今天不經意的寫出一個謬誤程式,我希望將一個用一維陣列儲存的100x100小圖片,放大2倍儲存到另一個二維陣列,放大方式就是將一個像素自我複製變成4個像素。 int FrameHeight = 480; int FrameWidth = 640; for(int h=0; h { for(int w=0; w { int idx1 = h*FrameWidth/4+w/2; int idx2 = h/2*FrameWidth/2+w/2; if (idx1 != idx2) { cerr << "(" << h << "," << w<< ") idx1=" << idx2 << " idx2=" << idx2 << endl; } } } idx1 = h*FrameWidth/4+w/2 idx2 = h/2*FrameWidth/2+w/2 idx1是對h*FrameWidth除以四 和 idx2先對h/2之後再除以2應該是一樣的吧!? 這個兩個運算看似數學上是相等且合理的,實際上卻是大大的不同! 實際上這兩個運算,因為使用了C/C++的整數運算特性,應表示成 idx1 = floor(h*FrameWidth / 4.0) + floor(w/2.0) idx2 = floor(floor(h / 2.0) * FrameWidth / 4.0) + floor(w/2.0) 當我們帶入 h, w為101, 100的時候 idx1 = 16210 = 16160 + 50 = floor(101 * 640 / 4.0) + ceil(100 / 2.0) idx2 = 16050 = 16000 + 50 = floor( 50 * 640 / 2.0) + ceil(100 / 2.0) = floor( floor(101/2.0) * 640 / 2.0) + floor(100