2011-07-22 120 views
1

我正在研究幾個例程,我必須從Matlab移植到Ansi-C。由於我不是一位Matlab老手,我試着向你詢問一些神祕的行。Matlab to C移植

1)

%Matlab 
[X,Y] = meshgrid(-k:k,-k:k); 

假設滿足K == 3,上面的行應該使TWO矩陣(X和Y)使用以下方面:

[-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 
X= [-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 


    [-3, -3, -3, -3, -3, -3, -3] 
    [-2, -2, -2, -2, -2, -2, -2] 
    [-1, -1, -1, -1, -1, -1, -1] 
Y= [ 0, 0, 0, 0, 0, 0, 0] 
    [ 1, 1, 1, 1, 1, 1, 1] 
    [ 2, 2, 2, 2, 2, 2, 2] 
    [ 3, 3, 3, 3, 3, 3, 3] 

是這正確?

2)下面的語句,我想創建一個子矩陣,是否有任何有效的方法來轉換它在正則C嗎?

I = A(iMin:iMax,jMin:jMax,:); 

感謝您的幫助!

+0

嗨!德雷頓沒有充分回答你的問題嗎?只是想知道爲什麼你沒有點擊接受他的答案......? –

回答

1

1)是:-)

2)我想你必須遍歷所述第二和第三指數(允許把它們叫做陣列j和k)和複製每個形式A的範圍( iMin:iMax,j,k)手動。

1

關於你的第二個問題,如果你不想使用任何其他庫,沒有捷徑。該操作稱爲array slicing,因此,如果您搜索可能提供類似內容的C庫,Google可能會提供幫助。另外,如果你不介意用C++而不是C編寫它,你可以看看http://arma.sourceforge.net/docs.html#syntax C和C++上還有各種其他線性代數庫我相信,但是犰狳似乎最接近於MATLAB可以提供什麼。

+0

嗨,烏斯頓,謝謝你的迴應。但是,我需要使用C,因爲我正在爲僅具有ansi-c子部分的嵌入式板編程。 – valvoline

1

1)是的,但是如果你正在編寫你自己的代碼,沒有理由浪費所有的空間。一個X矢量和Y矢量這樣:

int X[] = {-3, -2, -1, 0, 1, 2, 3}; 
int Y[] = {-3, -2, -1, 0, 1, 2, 3}; 

將允許您訪問相同的信息,但沒有浪費內存(這可能是在嵌入式系統上的一個大問題)。而不是訪問X(i,j)Y(i,j),您訪問X[i]Y[j]

2)根據數組的大小,可能會比訪問逐個元素更有效的選項。假設你是存儲陣列中列優先的順序(即

A_1,1 A_1,2 A_1,3 ... A_1,正

A_2,1 ...

存儲A_1, 1 A_1,2 A_1,3 ... A_1,正A_2,1 ...

您可以通過複製片以下:

/* Initialization code omitted, let A be n x m */ 
/* Also assuming that [i/j][Max/Min] are zero indexed */ 
int i, diff_i, diff_j; 
diff_i = iMax - iMin; 
diff_j = jMax - jMin; 

size_t stride = sizeof(YOUR DATA TYPE HERE) * (1 + diff_j); 

/* I = A(iMin:iMax,jMin:jMax,:); */ 
for(i = 0; i <= diff_i; i++){ 
    memcpy(&I[i*diff_j],&A[i*m + jMin],stride); 
} 

這將在同一時間搶行,而不是單個元素一次