Matlab到C移植

时间:2011-07-22 08:11:21

标签: c matlab

我正在研究几个我要从Matlab移植到Ansi-C的例程。由于我不是Matlab的老手,我试着向你询问一些神秘的行。

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,:); 

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

1)是: - )

2)我猜你必须遍历数组的第二个和第三个索引(让我们称之为j和k)并手动复制形式A(iMin:iMax,j,k)的每个范围。 / p>

答案 1 :(得分:1)

关于第二个问题,如果您不想使用任何其他库,则没有捷径。该操作称为array slicing,因此如果您搜索可能提供类似内容的C库,Google可能会提供帮助。

另外,如果你不介意用C ++而不是C编写,你可以看一下http://arma.sourceforge.net/docs.html#syntax C和C ++上有各种其他线性代数库我敢肯定,但是犰狳似乎最接近MATLAB可以提供的。

答案 2 :(得分:1)

1)是的,但如果您正在编写自己的代码,则没有理由浪费复制中的所有空间。 X-Vector和Y-Vector就是这样:

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,n

A_2,1 ......

存储A_1,1 A_1,2 A_1,3 ... A_1,n 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);
}

这将一次抓取一行,而不是一次抓取一个元素。