一維陣列與二維陣列轉換

這是我今天不經意的寫出一個謬誤程式,我希望將一個用一維陣列儲存的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)

看出來了嗎? 這兩個運算是不一樣的喔!

留言