2014-09-30 114 views
2

我很困惑將2D陣列轉換爲1D陣列。 我想以寬度,行和列格式的形式爲「a11」(在(1,1))編寫一個相鄰的8個元素,而不使用for循環。陣列2D到1D轉換和混淆

 |<--Width--->| 
      cols 
     ____________ 
     | a00 a01 a02 
    rows | a10 a11 a12 
     | a20 a21 a22 

我想以這樣的方式

a00 = pSrc[(cols-1)+ (rows - 1)*width];           
a02 = pSrc[(cols-1)+ (rows + 1)*width];           
a10 = pSrc[cols+ (rows -1)*width];             
a12 = pSrc[cols+ (rows +1)*width];             
a20 = pSrc[(cols+1)+ (rows - 1)*width];           
a22 = pSrc[(cols+1)+ (rows + 1)*width];           
a01 = pSrc[(cols-1)+ (rows)*width];            
a21 = pSrc[(cols+1)+ (rows)*width];            

但我認爲我做了一些錯誤。可以任何一個可以幫助我在這。

+1

爲了您的信息'a [i] [j] = *(*(a + i)+ j)'。 – 2014-09-30 04:27:25

+0

我不想使用for循環,因爲我正在用OpenCL編寫代碼。我正在用內核代碼替換循環。能否以上述格式給出我提到的答案 – Ashwin 2014-09-30 04:41:21

+0

如何定義pSrc?你的例子中'cols'設置爲'1'(並且'rows'設置爲'1')? – 2014-09-30 04:58:57

回答

2

目前尚不清楚如何定義pSrc,因爲您沒有顯示其定義。然而,你的代碼是符合它被聲明爲一維數組:

int pSrc[9]; // Or a larger dimension 

您的代碼可以理智地寫入,因此更均勻佈局:

a00 = pSrc[(cols-1) + (rows-1)*width]; 
a01 = pSrc[(cols-1) + (rows+0)*width]; 
a02 = pSrc[(cols-1) + (rows+1)*width]; 
a10 = pSrc[(cols+0) + (rows-1)*width]; 
a12 = pSrc[(cols+0) + (rows+1)*width]; 
a20 = pSrc[(cols+1) + (rows-1)*width]; 
a21 = pSrc[(cols+1) + (rows+0)*width]; 
a22 = pSrc[(cols+1) + (rows+1)*width]; 

+0將由甚至可以忽略不計最簡單的編譯器,幾乎可以肯定甚至沒有優化器,但它使代碼更容易閱讀。我還對條目進行了重新排序,因此上面的行先列出,然後是中間行,然後是最下面一行。再次,它可以更容易地看到模式。

這是很明顯,你正在使用'行'和'cols'倒退。你真的需要:

a00 = pSrc[(cols-1) + (rows-1)*width]; 
a01 = pSrc[(cols+0) + (rows-1)*width]; 
a02 = pSrc[(cols+1) + (rows-1)*width]; 
a10 = pSrc[(cols-1) + (rows+0)*width]; 
a12 = pSrc[(cols+1) + (rows+0)*width]; 
a20 = pSrc[(cols-1) + (rows+1)*width]; 
a21 = pSrc[(cols+0) + (rows+1)*width]; 
a22 = pSrc[(cols+1) + (rows+1)*width];