Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 矩阵的结构_C_Matrix - Fatal编程技术网

C 矩阵的结构

C 矩阵的结构,c,matrix,C,Matrix,我是CC99的一个完全的noob,在语言中添加了可变长度数组: _Bool gaussReduction(size_t rows, size_t cols, float matrix[rows][cols]); 如果你有定义的话 float naifMatrix[3][3] = { {2, 1, 3}, {0, -1, 4}, {1, 3, 0} }; 您可以通过 size_t rows = sizeof naifMatrix / sizeof *naifMatrix

我是CC99的一个完全的noob,在语言中添加了可变长度数组:

_Bool gaussReduction(size_t rows, size_t cols, float matrix[rows][cols]);
如果你有定义的话

float naifMatrix[3][3] = {
    {2, 1, 3},
    {0, -1, 4},
    {1, 3, 0}
};
您可以通过

size_t rows = sizeof naifMatrix / sizeof *naifMatrix;
size_t cols = sizeof *naifMatrix / sizeof **naifMatrix;
可以使用宏来最小化重复。使用

#define rowsof(MATRIX) (sizeof (MATRIX) / sizeof *(MATRIX))
#define colsof(MATRIX) (sizeof *(MATRIX) / sizeof **(MATRIX))
#define matrixarg(MATRIX) rowsof(MATRIX), colsof(MATRIX), (MATRIX)
你最终会得到

gaussReduction(matrixarg(naifMatrix));
或者,使用复合文字而不是变量

gaussReduction(matrixarg(((float [3][3]){ 
    {2, 1, 3},
    {0, -1, 4},
    {1, 3, 0}
})));
使用可变长度数组与等效的C90代码具有相同的性能特征-您将获得的唯一好处是更好的语法:

// C99:
_Bool gaussReduction(size_t rows, size_t cols, float matrix[rows][cols])
{
    // size_t i = ..., j = ...
    float x = matrix[i][j];

/* C90: */
int gaussReduction(size_t rows, size_t cols, float *matrix)
{
    /* size_t i = ..., j = ... */
    float x = matrix[i * cols + j];
如果您这样定义:

float naifMatrix[][] = {
    {2, 1, 3},
    {0, -1, 4},
    {1, 3, 0}
};
您应该有一个指向指针数组的指针。然后你可以用

gaussReduction(float ** naifMatrix);

但是我的C已经生锈了。

C数组不是锯齿状的-不能将二维数组转换为指向点的指针,也不能声明naifMatrix[]]这样的数组。只有第一个数组下标是可选的。应该是naifMatrix[][3]。这正是我的问题。二维数组最多只能转换为指向数组的指针。实际上这并没有什么错:指向指针的指针将是完全不同类型的数据。但事实是,我希望至少能够得到一个指向数据块开头的指针,我不知道如何做。那么,不要静态地声明/定义它。啊,我不能在我的评论中插入换行符?嘘。啊,我可以复制粘贴它们。浮动**naifMatrix;float*naifMatrix1={2,1,3};naifMatrix=malloc3*sizeoffloat*;naifMatrix[0]=naifMatrix1;大概是这样吧?就像我说的,我的C已经生锈了。我建议你买一份C的数字食谱并阅读。你将在那里学到你所需要的一切,还有更多。相关。@David:谢谢,但这不仅仅是我想做的事。:-我只是想学C,我并不期待建立一个线性代数库。在上面,您将发现我用函数为C gcc C11/C99以任何可能的方式分配和操作矩阵编写的程序。也许它会有用4u…非常感谢!我想这就是我们从一本关于he标准前一版本的书中学习C所得到的结果…:-D顺便问一下,相对于固定大小,使用可变大小数组是否会造成性能损失?@Andrea:可变长度数组只会带来性能损失,因为在编译时数组大小未知-但是,无论如何,当将数组作为函数参数传递时,这些信息都会丢失;我会在我的答案中添加一些关于C90的细节。。。
float naifMatrix[3][3] = {
    {2, 1, 3},
    {0, -1, 4},
    {1, 3, 0}
};
size_t rows = sizeof naifMatrix / sizeof *naifMatrix;
size_t cols = sizeof *naifMatrix / sizeof **naifMatrix;
#define rowsof(MATRIX) (sizeof (MATRIX) / sizeof *(MATRIX))
#define colsof(MATRIX) (sizeof *(MATRIX) / sizeof **(MATRIX))
#define matrixarg(MATRIX) rowsof(MATRIX), colsof(MATRIX), (MATRIX)
gaussReduction(matrixarg(naifMatrix));
gaussReduction(matrixarg(((float [3][3]){ 
    {2, 1, 3},
    {0, -1, 4},
    {1, 3, 0}
})));
// C99:
_Bool gaussReduction(size_t rows, size_t cols, float matrix[rows][cols])
{
    // size_t i = ..., j = ...
    float x = matrix[i][j];

/* C90: */
int gaussReduction(size_t rows, size_t cols, float *matrix)
{
    /* size_t i = ..., j = ... */
    float x = matrix[i * cols + j];
float naifMatrix[][] = {
    {2, 1, 3},
    {0, -1, 4},
    {1, 3, 0}
};
gaussReduction(float ** naifMatrix);