【问题标题】:Matlab to C portingMatlab 到 C 的移植
【发布时间】:2011-10-10 20:42:32
【问题描述】:

我正在研究几个我必须从 Matlab 移植到 Ansi-C 的例程。因为我不是 Matlab 的老手,所以我试着问你一些神秘的行。

1)

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

假设 k == 3,以上行应该使两个矩阵(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,:); 

感谢您的帮助!

【问题讨论】:

  • 你好valvoline!德雷顿没有充分回答你的问题吗?只是想知道为什么你没有点击接受他的回答...?

标签: c matlab


【解决方案1】:

1) 是的:-)

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您好,uston,感谢您的回复。但是,我需要使用 C,因为我正在为只有一部分 ansi-c 的嵌入式板进行编程。
    【解决方案3】:

    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]Y[j],而不是访问X(i,j)Y(i,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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 2015-06-18
      • 1970-01-01
      • 2013-12-04
      • 2010-10-08
      • 1970-01-01
      • 2015-04-02
      • 2014-06-27
      • 1970-01-01
      相关资源
      最近更新 更多