【问题标题】:Matrix as function input矩阵作为函数输入
【发布时间】:2020-04-21 00:52:22
【问题描述】:

我想构造一个以矩阵作为输入的函数,然后计算所有行(或列)的平均值。我试图这样做,但它给了我一堆错误。

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

int sum_rows[1000], sum_columns[1000], mean_row[1000], mean_column[1000], N, A[100][100], i, j;

void values(int A[N][N]) {
    for (i=0; i<N; ++i) {
        for (j=0; j<N; ++j) {
            A[i][j] = (rand()%61+20);
        }
    }
}

void mean_r (int A[N][N]) {
    for (i=0; i<N; ++i) {
        sum_row[i] = 0;
        for (j=0; j<N; ++j) {
            sum_row[i] += A[i][j];
        }
        mean_row[i] = sum_row[i]/N;
    }
}

void mean_c (int A[N][N]) {
    for (j=0; j<N; ++j) {
        sum_column[j] = 0;
        for (i=0; i<N; ++i) {
            sum_column[j] += A[i][j];
        }
        mean_column[j] = sum_column[j]/N;
    }
}

int main()
{
    int N;

    printf("Enter size of matrix: ");
    scanf("%d", &N);

    int A[N][N];

    values(A[N][N]);
    mean_r(A[N][N]);
    mean_c(A[N][N]);

    for (i=0; i<N; ++i) {
        for (j=0; j<N; ++j) {
            printf("A[%d][%d] = %d\n", i, j, A[i][j]);
        }
    }

    for (i=0; i<N; ++i) {
        printf("Mean row #%d = %.2f\n", i, mean_row[i]);
    }

    for (j=0; j<N; ++j) {
        printf("Promedio Columna #%d = %.2f\n", j, mean_column[j]);
    }

    return 0;
}

你能解释一下如何将矩阵传递给函数吗?我必须使用预先定义的函数来执行这些操作,然后在主函数中调用它。

【问题讨论】:

    标签: c function matrix


    【解决方案1】:

    您的矩阵似乎是动态的(行数和列数不固定)。在 C 语言中,不允许使用动态行和列声明数组数组,因为编译器不知道如何为您分配多少内存。您必须在运行时分配内存。在我的示例中,矩阵作为第一行、第二行等存储在内存中。在数学中,对矩阵元素的访问是通过行索引和列索引。 “行索引和列索引”根据我的示例中矩阵的存储方式,使用分配的内存的起始地址 + 行号 * 列号 + 列索引转换为元素的内存地址。注意:行号和列号都从零开始。第一个元素用 p 表示,其中 p+0*columncount+0) 是 p。下一个元素由 p+0*columncount+1 表示。此后,第二行第二列 (2,2) 的元素由 p+1*column count+1 表示。以下示例使用单指针表示动态矩阵(其他技术确实存在,例如指针数组)

    在我的示例中,创建并初始化了 3(三行)乘 4(四列)矩阵。 ProcessMatrix 函数显示每一行的总和。

    如果可能,我建议您使用 C++,它允许您按照一个整数的值指定的大小分配内存,这使事情变得更容易。如果您可以访问其他数学库(很多可用),您应该使用它们而不是尝试重新发明轮子。

    // c_matrix.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    #include <stdio.h>
    
    
    int GetElementValue(int* m, int rowIndex, int colIndex, int columnCount)
    {
        return *(m + (rowIndex * columnCount + colIndex));
    }
    
    void ProcessMatric(int* myMatrix, int rowcount, int colcount)
    {
        // calculate the sum of each row
        int sum = 0;
        for (int i = 0; i < rowcount; i++)
        {
            sum = 0;
            for (int j = 0; j < colcount; j++)
            {
    
                sum = sum + GetElementValue(myMatrix, i, j, colcount);
            }
    
            printf("Sum of row %d=%d\r\n", i+1, sum);
        }
    
    }
    
    int main()
    {
    
        int row = 3;
        int col = 4;
        int* matrix;
    
    
        //create the memory for the matrix 3 by 4.
        matrix = malloc(sizeof(int) * row * col);
    
        // in momery the matrix is stored as (row1,col1), (row1, col2), (row1,col3)...(row4,col1),(row4,col2),(row4, col3)
        // initialize the matrix as 0,1,2,3...11
        for (int i = 0; i < row * col; ++i)
        {
            *(matrix + i) = i;
        }
    
    
        ProcessMatric(matrix, row, col);
    
    
        free(matrix);
    
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      在您的主函数中,您声明一个 NxN 矩阵 A

       int A[N][N];
      

      正如 Yan 指出的那样,您无法以这种方式声明数组,因为编译器不知道 N 的值。直到程序编译并执行后,N 的值才会确定(即在运行时)。但是,除此之外,您似乎想要做的是传递 2d 数组。你需要传递的是A 本身(例如values(A);,但是你传递了

      values(A[N][N]);
      mean_r(A[N][N]);
      mean_c(A[N][N]);
      

      您所做的是索引两个维度,因此,通常会发生的情况是您只需传递一个 int(无论第 N 行和第 N 列中的内容)。但是,索引在 [0, N-1] 范围内,因此 A[N] 超出范围。它们的关键概念是数组(和其他数据结构)通过引用传递。当您声明 A 时,将分配连续空间来保存 N * N * sizeof(int),并且该空间的起始位置的虚拟地址存储在 A 中。因此,您的函数知道存储内容的内存地址,以便您可以访问它与 A[i][j] 一起使用,而无需通过一大块内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 2019-04-17
        • 1970-01-01
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 2015-05-13
        相关资源
        最近更新 更多