2011-02-01 66 views
3

我想将我在程序中的矩阵的特定列传递给函数。 如果我使用呼叫<function_name>(<matrix_name>[][<index>]);作为呼叫 然后我得到的错误将矩阵中的列传递给函数c

error: expected expression before ‘]’ token

所以,请帮我找到合适的方式 感谢

回答

5

您使用不存在的语法。

矩阵按行存储在内存中(或者更好,在第二个维度中,您可以为其指定行的语义),因此您不能在本地执行此操作。您可以将所有列元素复制到矢量(单维数组)中并传递它。

如果您只需要按列操作(而不是按行操作),则可以更改为第一个维和第二个维创建的语义:将矩阵视为matrix[row][column]而不是matrix[column][row]

否则,如果你需要经常这样做,寻找一个更好的数据结构,而不是一个简单的数组。

+0

试试这个替代结构http://stackoverflow.com/questions/3244495/most-efficient-way-to-get-columns-of-a-multi-dimensional-array-in-c/3245008#3245008 – JeremyP 2011-02-01 19:36:22

1

您将不得不重新格式化数据。该列在内存中不连续。例如,如果你有一个数组:

arr[5][4] 

然后试图通过一个“列”无异是想每5个元素通过在数组中。把它看作一个巨大的阵列。

1

这里有几件事你需要记住C语言。

我假设你的矩阵存储为一个二维数组,像这样:

float mat[4][4];

你需要记住的是,这是存储在内存中连续只有16彩车;你可以访问mat [3] [2]的事实只是编译器给你的一个捷径。不幸的是,它实际上并没有将这些元数据传递给其他函数调用。访问垫[3] [2]实际上是一个快捷方式:

mat[ (3*4 + 2) ]

当你进入一个功能,您需要指定要传递的矩阵的界限,然后列数量:

void do_processing(float* mat, int columns, int rows, int column_idx)

在这个函数中,你必须自己计算出特定条目,用公式:

mat[ (column_idx * rows) + row_idx ]

1

由于处理作品的方式,您不能简单地传递'列',因为'列'值实际上存储在'行'中。这就是为什么你的编译器不允许你在'行'引用中传递任何值,即:'[]'。

一个简单的解决方案是传递整个矩阵,并将列索引作为单独的整数和行数传递。然后,您的函数可以遍历每一行来访问该列的所有成员。 即:

functionName(matrixType** matrixRef, int colIndex, int numRows) 
{ 
    for(int i=0; i< numRows; ++i) 
     matrixType value = matrixRef[i][colIndex]; //Do something 
}