Giúp sửa lỗi trong C bài nhân 2 ma trận sử dụng phương pháp Stressen

Mọi người giúp mình sửa bài này với, cái này là bài tập môn phân tích và thiết kế thuật toán của mình, phương pháp này để giảm chi phí khi dùng nhân ma trận kích thước lớn, mọi người có thể tham khảo pp Stressen dưới đây hoặc google thêm:
còn đây là code:

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

void input(int*&a,int n);
void print(int* a,int n);
void split(int n,int* x,int*&a,int*&b,int*&c,int*&d);
void sum(int n,int* a,int* b,int*&c);
void sub(int n,int* a,int* b,int*&c);
void mulStressen(int* a,int* b,int*&c);
void join(int n,int*&x,int* a,int* b,int* c,int* d);
void maxtrixProduct(int* a,int* b,int*&c,int n);

int main(){
    int* a;
    int* b;
    int* c;
    int n;
    input(a,n);
    input(b,n);
    maxtrixProduct(a,b,c,n);
    print(c,n);
    getch();
    return 0;
}

void input(int*&a,int n){
	int i,j;
	printf("\n n= ");
	scanf("%d",&n);
	a=new int[n*n];
    for (i=0;i<n;i++)
        for ( j=0;j<n;j++){
                printf("Nhap a[%d][%d]: ",i,j);
                scanf("%d",&a[i*n+j]);
        }
}

void print(int* a,int n){
	int i;
    for( i=0;i<n;i++){
//          printf("\n");
            for(int j=0;j<n;j++){
                    printf(" %d",a[i*n+j]);
            }
            printf("\n");
    }
}

void split(int n,int* x,int*&a,int*&b,int*&c,int*&d){
    int m=n/2;
	int i,j;
    for(i=0;i<m;i++)
        for(j=0;j<m;j++) a[k++]=x[i*n+j];
    for(i=0;i<m;i++)
        for(j=m;j<n;j++) b[k++]=x[i*n+j];
    for(i=m;i<n;i++)
        for(j=0;j<m;j++) c[k++]=x[i*n+j];
    for(i=m;i<n;i++)
        for(j=m;j<n;j++) d[k++]=x[i*n+j];
}

void sum(int n,int* a,int* b,int*&c){
    int i;
	for( i=0;i<n;i++)
      for( j=0;j<n;j++)
        c[i*n+j]=a[i*n+j]+b[i*n+j];
}

void sub(int n,int* a,int* b,int*&c){
	int i;
    for(i=0;i<n;i++)
      for(j=0;j<n;j++)
        c[i*n+j]=a[i*n+j]-b[i*n+j];
}

void mulStressen(int* a,int* b,int*&c){
    int m1,m2,m3,m4,m5,m6,m7;
    m1=(a[0*2+1]-a[1*2+1])*(b[1*2+0]+b[1*2+1]);
    m2=(a[0*2+0]+a[1*2+1])*(b[0*2+0]+b[1*2+1]);
    m3=(a[0*2+0]-a[1*2+0])*(b[0*2+0]+b[0*2+1]);
    m4=(a[0*2+0]+a[0*2+1])*b[1*2+1];
    m5=a[0*2+0]*(b[0*2+1]-b[1*2+1]);
    m6=a[1*2+1]*(b[1*2+0]-b[0*2+0]);
    m7=(a[1*2+0]+a[1*2+1])*b[0*2+0];

    c[0*2+0]=m1+m2-m4+m6;
    c[0*2+1]=m4+m5;
    c[1*2+0]=m6+m7;
    c[1*2+1]=m2-m3+m5-m7;
}

void join(int n,int*&x,int* a,int* b,int* c,int* d){
    int m=n/2;
	int i,j;
    for(int i=0;i<m;i++)
      for(int j=0;j<m;j++)
         x[i*n+j]=a[k++];
    for(i=0;i<m;i++)
      for(j=m;j<n;j++)
         x[i*n+j]=b[k++];
    for(i=m;i<n;i++)
      for(j=0;j<m;j++)
         x[i*n+j]=c[k++];
    for(i=m;i<n;i++)
      for(j=m;j<n;j++)
         x[i*n+j]=d[k++];
}

void maxtrixProduct(int* a,int* b,int*&c,int n){
    if(n==2)mulStressen(a,b,c);
    else{
        int* d1=(int*) malloc(sizeof(int)*n*n);
        int* d2=(int*) malloc(sizeof(int)*n*n);
        int* a00=(int*) malloc(sizeof(int)*n*n);
        int* a01=(int*) malloc(sizeof(int)*n*n);
        int* a10=(int*) malloc(sizeof(int)*n*n);
        int* a11=(int*) malloc(sizeof(int)*n*n);
        int* b00=(int*) malloc(sizeof(int)*n*n);
        int* b01=(int*) malloc(sizeof(int)*n*n);
        int* b10=(int*) malloc(sizeof(int)*n*n);
        int* b11=(int*) malloc(sizeof(int)*n*n);
        int* c00=(int*) malloc(sizeof(int)*n*n);
        int* c01=(int*) malloc(sizeof(int)*n*n);
        int* c10=(int*) malloc(sizeof(int)*n*n);
        int* c11=(int*) malloc(sizeof(int)*n*n);

        split(n,a,a00,a01,a10,a11);
        split(n,b,b00,b01,b10,b11);
        split(n,c,c00,c01,c10,c11);

        maxtrixProduct(a00,b00,d1,n/2);
        maxtrixProduct(a01,b10,d2,n/2);
        sum(n/2,d1,d2,c00);

        maxtrixProduct(a00,b01,d1,n/2);
        maxtrixProduct(a01,b11,d2,n/2);
        sum(n/2,d1,d2,c01);

        maxtrixProduct(a10,b00,d1,n/2);
        maxtrixProduct(a11,b10,d2,n/2);
        sum(n/2,d1,d2,c10);

        maxtrixProduct(a10,b01,d1,n/2);
        maxtrixProduct(a11,b11,d2,n/2);
        sum(n/2,d1,d2,c11);

        join(n,a,c00,c01,c10,c11);
      }
}

Mọi người dùng c giúp mình nha, chỗ nào mình nhầm c++ thì sửa lại giúp với nha.

Trong code này sử dụng reference, tức là dấu & khi truyền tham số vào hàm. Khái niệm này chỉ có ở C++, không tồn tại trong C.

Bài này bị lỗi gì nhỉ?

Hàm split có vấn đề. Mình nghĩ là k = 0 trước mỗi vòng for của cấc trận. Mà sao k dùng mảng 2 chiều?
Hàm matrixProduct mới là strassen. Bạn tính các phần p1,p2… Theo công thức trên. Mình nghĩ là đang thiếu. TH đặc biệt n=2 làm như bạn cũng dc. Sao k làm th n= 1 c[0]=a[0]*b[0].

1 Like

Mình thấy những bài khác có reference để truyền vào hàm, mình dùng devC để compile, phần mở rộng file là .c thì nó vẫn chạy mà?

Mình không biết lỗi gì mới mò lên nhờ mọi người đây :\

DevC là IDE, không phải compiler. Bạn phải kiểm tra compiler xem đó có phải là compiler C++ hay không.

Phần mở rộng không quan trọng đối với compiler.

Mình nghĩ nếu n=1 thì c=a.b rồi tính ma trận làm gì nữa :smiley:
Mình cũng đang thắc mắc là theo thuật toán này nếu n lẻ thì làm sao split ra mà tính?

Là devC++, nó có MinGW GCC là để compile đó chứ nhỉ? :open_mouth:
Lúc trước mình cũng dùng cấp phát động là new với file .c nhưng nó báo lỗi phải chuyển qua malloc với sizeof đó ad

Bloodshed Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language

Báo lỗi về việc sử dụng sai cú pháp new hay báo lỗi new không được hỗ trợ?


Vừa mới viết thử một file helloworld.c và code C++ bên trong, sử dụng std::cout, std::endlnew

strassen nhân 2 ma trận dạng n=2^k thôi. bạn có thể biến ma trận hiện tại thành dạng đó, sau đó copy kết quả. Đây là 1 bài viết trước của mình: https://github.com/boconganh/algorithm/blob/master/c/strassen.c

1 Like

Ồ, rứa là sai cách nghĩ rồi. Cảm ơn ad nhiều.
Mà hôm trước coi video của ad có nói tải cả IDE và compiler là sao nhỉ, IDE compile đc nhưng vẫn không đc gọi là compiler? Mình thường dùng devC có cả compiler cho đơn giản, cái code::block mạnh hơn,dễ debug hơn nhưng nhiều lúc cùng 1 đoạn code mà ông chạy được ông thì không nghe mệt, tại do cái C99 hôm bữa ad nói devC không có, mà cô giáo mình lại dùng devC chấm bài nữa luôn nên an phận với nó vậy.

Bài của bạn cũng phức tạp gớm, hơn cả mình nhiều với mấy cái thư viện với hàm lạ hoắc mình chưa học tới nữa. Thanks anyway. Mà hitgub là trang gì, có giống forum này không bạn? :astonished:

IDE không compile được, IDE chỉ gọi compiler compile code. IDE = Editor + Compiler + một số tính năng quản lý project. Người viết compiler và người viết IDE là 2 người khác nhau.

DevC chỉ “mượn” compiler MinGW để compile code thôi, DevC không compile code.

1 Like

oh. clear enough :astonished: :no_mouth:
thanks

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?