一維陣列與二維陣列轉換
這是我今天不經意的寫出一個謬誤程式,我希望將一個用一維陣列儲存的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 / 2.0)
看出來了嗎? 這兩個運算是不一樣的喔!
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;
}
}
}
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 / 2.0)
看出來了嗎? 這兩個運算是不一樣的喔!
留言