我想将程序中的矩阵的特定列传递给函数。
如果我使用呼叫<function_name>(<matrix_name>[][<index>]);
作为呼叫
然后我收到错误
错误:']'之前的预期表达式 令牌
所以请帮我找到合适的方法 感谢
答案 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
}