2013-04-20 66 views
-2

這是我的代碼片段;C無符號字符算術運算不能按預期工作

Npp8u * imageHost; 
typedef unsigned char Npp8u; 
... 
for (int i=0;i<nHeight;++i) 
    { 
     for (int j=0;j<nWidth;++j) 
     { 
      printf("number_befre : %u\n",imageHost[i*nWidth+j]); 
      imageHost[i*nWidth+j] = imageHost[i*nWidth+j]-Npp8u(min); 
      imageHost[i*nWidth+j] = imageHost[i*nWidth+j]/(max-min); 
      printf("number : %u\n",imageHost[i*nWidth+j]); 
     } 
    } 
... 

某些值被分配給max = 202min = 0和從imageHost萃取。我通過調試糾正了它,但整個元素的內容爲imageHost。我能做些什麼來使這些陳述以合理的精度工作?這是關於我使用的數據類型的限制嗎?

+0

'Nppu(min)'無效C.您是否將其編譯爲C++? – 2013-04-20 13:09:32

+0

抱歉的代碼是缺乏,我編輯 – erogol 2013-04-20 13:09:44

+0

這實際上是cuda代碼,但主機端 – erogol 2013-04-20 13:12:06

回答

0

IFimageHost[i*nWidth+j]然後小於max-min

imageHost[i*nWidth+j]/(max-min) 

將爲零。因爲unsigned char不能[0.0 .. 1.0]

之間真正的值存儲具有更高的精度,你應該使用浮點運算。

+0

imageHost屬於同一類型,並從中提取最大值和最小值。 – erogol 2013-04-20 13:17:25

+0

由於我所執行的計算的性質,所有值都不可能代數爲0,但由於我使用的數據類型可能爲0,因此我期望聽到的解決方案不是問題。無論如何謝謝 – erogol 2013-04-20 13:22:29

+0

我不明白downvote的原因?! – deepmax 2013-04-20 13:25:03

0

我想你的問題是imageHost內存。 。檢查其內存(後以前的行如果可能的話) 或第一行變量值做到這一點和調試程序(在第二行斷點):

Npp8u x=Npp8u(min); 
imageHost[i*nWidth+j] = imageHost[i*nWidth+j]-x; 

你記憶imageHost(這樣做):

Npp8u ** imageHost=new *Npp8u*[nHeight]; 
for(int i=0;i<nHeight;i++) 
    imageHost[i]=new Npp8u[nWidth]; 
2

您正試圖將數字規範化爲0.0到1.0之間。但是你選擇的數據類型並不適合,因爲它只能處理整數。你需要的代碼是這樣的

typedef unsigned char Npp8u; 
Npp8u * imageHost = ...; 
vector<float> normalizedImageHost(nHeight*nWidth) 
... 
for (int i=0;i<nHeight;++i) 
{ 
    for (int j=0;j<nWidth;++j) 
    { 
     normalizedImageHost[i*nWidth+j] = (float)(imageHost[i*nWidth+j] - min)/ 
      (max - min); 
    } 
} 

另一種選擇是保持Npp8u但使用的比例因子。例如,我們可以乘以最大Npp8u值爲255的所有值。

typedef unsigned char Npp8u; 
Npp8u * imageHost = ...; 
... 
for (int i=0;i<nHeight;++i) 
{ 
    for (int j=0;j<nWidth;++j) 
    { 
     imageHost[i*nWidth+j] = (Npp8u)((255.0*(imageHost[i*nWidth+j] - min))/ 
      (max - min)); 
    } 
}