繁体   English   中英

用C转置矩阵函数,函数接收和返回2D数组

[英]Transpose matrix function in C, with function receiving and returning a 2D array

我需要创建一个接受矩阵并返回转置的函数。 唯一的要求是它直接返回一个矩阵,而不仅仅是通过引用对其进行修改。 到目前为止,这是我所做的:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define ROW 100000000
#define COL 100000000

int (*(f_MatTrans)(int mat[][COL], int r, int c))[COL];

int main(void)
{
int x[2][2]={1,2,3,4};
int (*a)[2];
a=f_MatTrans(x,2,2);

for(int i=0; i<2; i++)
{
    for(int j=0; j<2; j++)
    {
        printf("X[%d][%d]=%d\n",i,j,x[i][j]);
        printf("A[%d][%d]=%d\n",i,j,a[i][j]);
    }
}

return 0;
}

int (*(f_MatTrans)(int mat[][COL], int r, int c))[COL]
{
int a[c][r];

for(int i=0; i<r; i++)
{
    for(int j=0; j<c; j++)
    {
        a[j][i]=mat[i][j];
    }
}

return a;

}

这样做的目的是在我自己创建的库中包含该函数,以防万一它是有用的信息。

您不能返回指向本地数组的指针,因为函数返回时该指针将不再存在。 如果您希望函数创建结果数组(而不是写入传递给函数的其他数组),则在以下情况下必须使用malloc()

//The return type is actually `int (*)[r]`, but C doesn't like that.
int* f_MatTrans(int r, int c, int mat[][c]) {
    int (*a)[r] = malloc(c*sizeof(*a));
    for(int i=0; i<r; i++) {
        for(int j=0; j<c; j++) {
            a[j][i]=mat[i][j];
        }
    }
    return *a;
}

请注意,我更改了数组类型:如果将mat声明为int mat[][COL] ,则数字COL将用于计算偏移量mat[1][0] ,它将是您的第一个元素之后的100000000整数情况下,您传入的数组仅包含四个整数。 这是未定义的行为,如果执行此操作,则允许程序格式化硬盘。

不幸的是,返回的指针的类型不可能依赖于函数参数的值。 这就是为什么我将返回类型更改为普通整数指针的原因,您必须证明这意味着它是int (*)[r]类型的指针。

您将使用上面的函数,如下所示:

int main(void) {
    int x[2][3]={1,2,3,4,5,6};
    int (*a)[2] = (int (*)[2])f_MatTrans(2, 3, x);

    for(int i=0; i<2; i++) {
        for(int j=0; j<2; j++) {
            printf("X[%d][%d]=%d\n",i,j,x[i][j]);
            printf("A[%d][%d]=%d\n",i,j,a[i][j]);
        }
    }

    free(a);    //Cleanup!
    return 0;
}

由于数组x与函数签名不兼容,因此问题(当我阅读时)中的代码无法编译。

我不清楚您的问题的真正约束是什么。 在C99或C11中执行此操作的简单方法是使用VLA表示法:

#include <stdio.h>

static void MatrixTranspose(int r, int c, int src[r][c], int dst[c][r])
{
    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            dst[j][i] = src[i][j];
}

int main(void)
{
    int x[3][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
    int y[2][3];

    MatrixTranspose(3, 2, x, y);

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            printf("X[%d][%d]=%d  ", i, j, x[i][j]);
            printf("Y[%d][%d]=%d\n", j, i, y[j][i]);
        }
    }

    return 0;
}

样本输出:

X[0][0]=0  Y[0][0]=0
X[0][1]=1  Y[1][0]=1
X[1][0]=2  Y[0][1]=2
X[1][1]=3  Y[1][1]=3
X[2][0]=4  Y[0][2]=4
X[2][1]=5  Y[1][2]=5

我的怀疑是您应该做一些不同的事情(从概念上讲更复杂),但目前尚不清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM