【问题标题】:concatenate 2 matrices连接 2 个矩阵
【发布时间】:2013-03-04 08:09:08
【问题描述】:

我有一个动态分配的矩阵,我想创建另一个矩阵,它是第一个矩阵,但旁边还有另一个副本。例如,我有矩阵:

11 22

我的新矩阵将是:

1 1 1 1 2 2 2 2

如何连接它们?这是我的 C 代码:

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

int **create_matrix(int row, int col)
{
    int **matrix = malloc(sizeof (int*)*row);
    int i;
    for (i = 0; i < row; i++)
    {
        matrix[i] = malloc(sizeof (int)*col);
    }
    return matrix;
}

void matrix_input(int **matrix, int row, int col)
{
    int i, j;
    printf("enter the elements of the matrix:\n");
    for (i = 0; i < row; i++)
    {

        for (j = 0; j < col; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }
}

int **extend_matrix(int **matrix, int row, int col)
{
    int k, j;
    int i;
    int **extend_matrix = malloc(sizeof (int*)*row);
    for (k = 0; k < row + row; k++)
    {
        extend_matrix[k] = malloc(sizeof (int)*col);
    }
    extend_matrix = matrix;
    extend_matrix = (int**) realloc(extend_matrix, (row + row) * sizeof (int*));
    extend_matrix[j] = matrix[j];
    for (i = 0; i < row; i++)
    {
        extend_matrix[k] = matrix[i];
    }
}

void print_matrix(int **matrix, int row, int col)
{
    int i, j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            printf(" %d ", matrix[i][j]);
        }
        printf("\n");
    }

}

void print_extend_matrix(int **extend_matrix, int row, int col)
{
    int k, j;
    for (k = 0; k < row + row; k++)
    {
        for (j = 0; j < col; j++)
        {
            printf("%d", extend_matrix[k][j]);
        }
        printf("\n");
    }
}

int main(void)
{
    int **matrix;
    int **extend_matrix;
    int row, col;
    printf("enter the number of rows of cols:");
    scanf("%i%i", &row, &col);
    matrix = create_matrix(row, col);
    matrix_input(matrix, row, col);
    print_matrix(matrix, row, col);
    print_extend_matrix(extend_matrix, row, col);
    getch();
    return 0;
} 

【问题讨论】:

  • 您没有使用真正的矩阵,而只是通过指针数组进行仿真。这从一开始就是一个糟糕的设计。
  • 一目了然,您是否忘记在代码中调用extend_matrix()?你也没有从扩展矩阵返回任何东西

标签: c dynamic matrix


【解决方案1】:

虽然@NPE 向您建议了一个更好的方法。如果要在extend_matrix()中分配内存

代码中的错误(读取 cmets

int **extend_matrix = malloc(sizeof (int*)*row);
                                           ^ on row
for (k = 0; k < row + row; k++)            
                    ^ where as loop is for row + row
{
    extend_matrix[k] = malloc(sizeof (int)*col);  // So this cause an error,
                                                  // segment-fault
}

第二,你的概念是错误的复制记忆:

 extend_matrix = matrix;  

在这一行,您将 matrix 分配给 extend_matrix 是错误的。您需要在此处循环将每个元素从matrix[][] 复制到extend_matrix[][]。 (但要先纠正你的内存分配代码

【讨论】:

    【解决方案2】:

    我认为extend_matrix() 应该只调用create_matrix() 来创建一个双倍宽度的新矩阵,然后使用两个简单的嵌套循环来填充它。

    【讨论】:

    • 这是最简单的方法
    【解决方案3】:

    如果这是你要找的:

    int concat(void * oldM, int row, int col,void& *newM) {
         newM = malloc(sizeof(int)*row*col*2);
    
         for(int i = 0;i<2;++i)
          for(int j=0;j<2;++j)
             newM[i][j+col] = newM[i][j] = oldM[i][j]; 
    
        for(int i = 0;i<2;++i)  {
          for(int j=0;j<4;++j) {
            cout<<"\t"<<newM[i][j];
          }
          cout<<"\n";
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      相关资源
      最近更新 更多