【问题标题】:C programming transpose matrix, #defineC 编程转置矩阵,#define
【发布时间】:2013-09-28 19:35:24
【问题描述】:

你能帮帮我吗,我有问题。这是转置矩阵的程序。当行数或列数等于 357 或更大时,程序不起作用(定义 MAX_n 357,定义 MAX_m 357)。小于357时程序正常工作。

#include <stdio.h>
#include <stdlib.h>
#define MAX_m 357
#define MAX_n 357
void main()  
{  
  int a[MAX_m][MAX_n],b[MAX_m][MAX_n]; 
  int r=0,j,i;
  printf("\nProgram to transpose matrix\n");  
  for(i=0;i<MAX_m;i++)  
    {  
        for(j=0;j<MAX_n;j++)  
    {  
      r=rand();
      a[i][j]=r;  
    }  
 }  
 printf("\nMatrix A: "); 
 for(i=0;i<MAX_m;i++)  
 {  
     printf("\n");  
     for(j=0;j<MAX_n;j++)  
    {  
      printf(" ");  
      printf("%d",a[i][j]); 
    }  
 }
 for(i=0;i<MAX_m;i++)  
 {  
    for(j=0;j<MAX_n;j++)  
   {  
     b[i][j]=a[j][i];
   }  
 }  
printf("\nResultant Matrix: "); 
for(i=0;i<MAX_m;i++) 
{  
  printf("\n"); 
  for(j=0;j<MAX_n;j++)
    { 
      printf(" ");  
      printf("%d",b[i][j]);
    }  
    } 
   printf("\n"); 
   return(0);
   }  

【问题讨论】:

  • "357 或更大的程序不起作用" - 它是如何失败的? - 崩溃、挂起、不正确的输出,还有什么?
  • a 正在堆栈分配。是否有可能您使用了太多堆栈? 357 * 357 * sizeof(int) 大约是 1/2 兆。你动态分配a 会发生什么?
  • 更糟糕的是,他为ab 分配了两次空间,使用了将近一兆字节的堆栈。告诉我们当您将 ab 声明为全局变量时会发生什么。
  • 当程序即将启动时,消息“应用程序停止工作”......我认为问题是堆栈溢出,我不知道如何解决它。我需要大矩阵 1024*1024。
  • 我很好奇 - 你使用的是什么操作系统?

标签: c matrix c-preprocessor transpose


【解决方案1】:

正如其他人在 cmets 中所说,这一定是内存分配问题。在 Unix 上,您可以在 Bash shell 中检查 ulimit -s 以了解您的堆栈大小限制,或在 tcsh 中检查 limit stack

由于这看起来像家庭作业,我将把它留给你和你的老师讨论不同的内存分配策略。

P.S.,将来指出您遇到的故障类型会很有帮助,而不仅仅是“它没有工作”。

【讨论】:

  • 当程序即将启动时,消息“应用程序停止工作”...我认为问题是堆栈溢出,我不知道如何解决它。我需要大矩阵 1024*1024。感谢您的帮助
【解决方案2】:

我是用 C++ 做的,我创建了一个类 Matrix。 你可以很容易地用 C 语言做到这一点。我知道二维数组似乎更容易理解(在转置时),但它们只是写下它们的一种方便方法(有一点开销)并且是等效的。您还可以看到这段代码的效率。

#include <iostream>
#include <time.h>
using namespace std;

void print_array(int * A, int rows, int cols);

class Matrix{
int rows, cols;
int *A;

public:
Matrix(){};
Matrix (int *A, int rows, int cols): rows(rows), cols(cols) {
    this->A = A;
    };

Matrix transpose(){
    int* T;
    T = new int[rows*cols];
    int rows_T(this->cols);
    int cols_T(this->rows);
    for(int i=0;i<rows_T;++i){
        for (int j=0;j<cols_T;++j){
            T[i*cols_T+j] = this->A[j*cols+i];  //T[i][j]=A[j][i]
        }
    }   
return Matrix(T, rows_T, cols_T);
};

void print(){
    for (int i=0;i<rows;++i){
        for(int j=0;j<cols;j++){
            cout<<A[i*cols+j]<<" ";
        }
        cout<<" "<<endl;
    }
}
};

void print_array(int * A, int rows, int cols){

for (int i=0;i<rows;++i){
    for(int j=0;j<cols;j++){
        cout<<A[i*cols+j]<<" ";
    }
    cout<<" "<<endl;
}

}



int main(){

clock_t t;
t= clock();

int rows(2000), cols(1000);
int *A = new int[rows*cols];
for(int i=0;i<rows*cols;++i){
    A[i]= rand() %10;
}

Matrix M1(A, rows, cols);

Matrix B;
B = M1.transpose();

t = (clock()-t);
cout<<"took (seconds): "<<t/1000000.0 <<endl;

return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多