繁体   English   中英

在C中根据条件或切换情况初始化矩阵(2D数组)

[英]Initializing a matrix (2D array) on condition or in switch case, in C

我想将矩阵(3x3数组)发送给另一个函数,以将其乘以某些东西。 但是我希望这个矩阵的内容是有条件的。

方法1:

 typedef float Mat3[3][3];

 void rotate(Point *p, float theta){

int choice = ((int)theta/90)%4;

switch(choice){
    case 0: matMult(p, {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}); break;
    case 1: matMult(p, {{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}}); break;
    case 2: matMult(p, {{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}}); break;
    case 3: matMult(p, {{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}}); break;
    default: matMult(p, {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}); break;
}
 }

方法2:

void rotate(Point *p, float theta){

int choice = ((int)theta/90)%4;
Mat3 matrix = NIL;
switch(choice){
    case 0: matrix = {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}; break;
    case 1: matrix = {{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}}; break;
    case 2: matrix = {{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}}; break;
    case 3: matrix = {{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}}; break;
    default: matrix = {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}; break;
}
  matMult(p, matrix);
  }

方法3

   void rotate(Point *p, float theta){

int choice = ((int)theta/90)%4;
switch(choice){
    case 0: Mat3 matrix = {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}; break;
    case 1: Mat3 matrix = {{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}}; break;
    case 2: Mat3 matrix = {{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}}; break;
    case 3: Mat3 matrix = {{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}}; break;
    default: Mat3 matrix = {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}; break;
}
  matMult(p, matrix);
  }

他们都不工作,我收到关于}或;的大约50个错误。 放在错误的位置,我很确定这不是问题。 有任何想法吗? 谢谢

不能在C中将矩阵分配给它们,只能对其进行初始化,或者可以分配其各个组件。

您可以采用多种方法进行操作,最简单的方法可能不是switch而是一系列Mat3

static Mat3 const matrix[] = {
 {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}},
 {{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}},
 {{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}},
 {{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}},
};

unsigned choice = ((unsigned)(theta/90))%4u;
matMult(p, matrix[choice]);
  • 我添加了const因为它看起来函数的第二个参数是只读的。
  • 在真正执行代码之前, static仅分配和初始化了一次。
  • choice值的unsigned保证使用%的算术运算实际上会产生03值,而不是负数。

从C99开始可以使用复合文字。 您可以编写如下:

void rotate(Point *p, float theta){
    int choice = ((int)theta/90)%4;

    switch(choice){
        case 0:  matMult(p, (Mat3){{1.0,0.0,0.0},  {0.0,1.0,0.0},  {0.0,0.0,1.0}}); break;
        case 1:  matMult(p, (Mat3){{0.0,-1.0,0.0}, {1.0,0.0,0.0},  {0.0,0.0,1.0}}); break;
        case 2:  matMult(p, (Mat3){{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}}); break;
        case 3:  matMult(p, (Mat3){{0.0,1.0,0.0},  {-1.0,0.0,0.0}, {0.0,0.0,1.0}}); break;
        default: matMult(p, (Mat3){{1.0,0.0,0.0},  {0.0,1.0,0.0},  {0.0,0.0,1.0}}); break;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM