将列从矩阵中传递给c中的函数

时间:2011-02-01 17:39:57

标签: c

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

  

错误:']'之前的预期表达式   令牌

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

4 个答案:

答案 0 :(得分:5)

您使用的语法不存在。

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

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

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

答案 1 :(得分:1)

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

arr[5][4]

然后尝试传递'列'就像尝试传递数组中的每个第5个元素一样。把它想象成一个巨大的阵列。

答案 2 :(得分:1)

在这里你需要记住一些关于C的事情。

我假设您的矩阵存储为2D数组,如下所示:

float mat[4][4];

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

的快捷方式

mat[ (3*4 + 2) ]

当你将它传递给一个函数时,你需要指定你传入的矩阵的边界,然后是列号:

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

在此功能中,您必须使用以下公式自行计算特定条目:

mat[ (column_idx * rows) + row_idx ]

答案 3 :(得分:1)

由于寻址方式有效,您无法简单地传递“列”,因为“列”值实际存储在“行”中。这就是为什么你的编译器不允许你在'row'引用中没有传递任何值,即:'[]'。

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

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