将矩阵中的列传递给c中的函数
我想把程序中矩阵的一列传递给一个函数。 如果我使用调用将矩阵中的列传递给c中的函数,c,C,我想把程序中矩阵的一列传递给一个函数。 如果我使用调用([])作为调用 然后我得到了错误 错误:应在“]”之前使用表达式 代币 所以请帮我找到合适的方法 谢谢您使用的语法不存在 矩阵是按行存储在内存中的(或者更好地说,是按第二个维度存储的,您可以为其提供行的语义),因此不能以本机方式存储。您可以将所有列元素复制到向量(一维数组)中并传递它 如果您只需要按列(而不是按行)工作,您可以更改第一维度和第二维度的语义:将矩阵视为matrix[row][column],而不是matrix[column][
([])代码>作为调用
然后我得到了错误
错误:应在“]”之前使用表达式
代币
所以请帮我找到合适的方法
谢谢您使用的语法不存在
矩阵是按行存储在内存中的(或者更好地说,是按第二个维度存储的,您可以为其提供行的语义),因此不能以本机方式存储。您可以将所有列元素复制到向量(一维数组)中并传递它
如果您只需要按列(而不是按行)工作,您可以更改第一维度和第二维度的语义:将矩阵视为matrix[row][column]
,而不是matrix[column][row]
否则,如果您需要经常这样做,请寻找更好的数据结构,而不是简单的数组。您必须重新格式化数据。该列在内存中不连续。例如,如果您有一个数组:
arr[5][4]
然后尝试传递一个“列”就像尝试传递数组中的每5个元素一样。把它想象成一个巨大的数组。关于C,这里有几件事需要记住
我假设矩阵存储为2D数组,如下所示:
float mat[4][4]代码>
您需要记住的是,这只是连续存储在内存中的16个浮点;事实上,您可以访问mat[3][2],这只是编译器给您的一个快捷方式。不幸的是,它实际上并没有将任何元数据传递给其他函数调用。访问mat[3][2]实际上是实现以下目的的快捷方式:
mat[(3*4+2)]
将其传递到函数中时,需要指定要传递的矩阵的边界,然后指定列号:
void do\u处理(float*mat、int列、int行、int列\u idx)
在该函数中,您必须使用以下公式自己计算特定条目:
mat[(column\u idx*rows)+row\u idx]
由于寻址的工作方式,您不能简单地传递“column”,因为“column”值实际上存储在“rows”中。这就是为什么编译器不允许您在“行”引用中不传递任何值,即:“[]”
一个简单的解决方案是传递整个矩阵,并将列索引作为单独的整数和行数传递。然后,您的函数可以遍历每一行以访问该列的所有成员。
即:
functionName(matrixType**matrixRef,int-colIndex,int-numRows)
{
对于(int i=0;i
尝试此替代结构
functionName(matrixType** matrixRef, int colIndex, int numRows)
{
for(int i=0; i< numRows; ++i)
matrixType value = matrixRef[i][colIndex]; //Do something
}