在C语言中将矩阵中的一列传递给函数

3
我想将程序中的特定矩阵列传递给一个函数。如果我使用"<function_name>(<matrix_name>[][<index>]);"进行调用,则会出现以下错误:

错误:在']'标记前预期表达式

请帮我找到适当的方法,谢谢。
4个回答

5

您使用的语法不存在。

矩阵按行(或更好地说,按第二维存储在内存中,您将其赋予行的语义),因此您无法原生地进行操作。 您可以将所有列元素复制到向量(单个维度数组)中并传递它。

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

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


尝试使用这种替代结构:http://stackoverflow.com/questions/3244495/most-efficient-way-to-get-columns-of-a-multi-dimensional-array-in-c/3245008#3245008 - JeremyP

2
由于寻址方式的限制,您不能仅传递“列”,因为“列”值实际上存储在您的“行”中。这就是为什么编译器不允许您在“row”引用中传递没有值的“[]”的原因。
一个简单的解决方案是传递整个矩阵,以及将列索引作为单独的整数和行数一起传递。然后,您的函数可以遍历每一行以访问该列的所有成员。 例如:
functionName(matrixType** matrixRef, int colIndex, int numRows)  
{  
   for(int i=0; i< numRows; ++i)  
      matrixType value = matrixRef[i][colIndex]; //Do something  
}

1

你需要重新格式化数据。该列在内存中不是连续的。例如,如果你有一个数组:

arr[5][4]

尝试传递“列”就像尝试传递数组中的每5个元素一样。将其视为一个巨大的数组。

1

在这里你需要记住几件事情与 C 相关。

我假设你的矩阵是以二维数组的形式存储的,就像这样:

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]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接