Đánh giá, nhận xét, review các công ty tuyển dụng
Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Định thức và ma trận nghịch đảo của ma trận

  1. #1
    Ngày gia nhập
    12 2007
    Bài viết
    10

    Mặc định Định thức và ma trận nghịch đảo của ma trận

    Mình đang học C++( trước đây chưa từng học một ngôn ngữ nào, kể cả C), có một bài tập, nhờ mọi người chỉ giúp.
    Đề: nhập vào một ma trận, tính và in ra định thức của ma trận và ma trận nghịch đảo của ma trận vừa nhập.
    thank!
    Mình không đọc được mấy cuốn giải thuật vì toàn viết bằng Pascal. Nếu có code luôn (bằng C cũng đc) thì rất cảm ơn.
    Đã được chỉnh sửa lần cuối bởi valiant-man : 04-12-2007 lúc 04:24 PM.

  2. #2
    Ngày gia nhập
    12 2007
    Bài viết
    10

    help me! Why no_people here?

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,918

    Cho mình hỏi "Định thức" của ma trận nghĩa là sao nhỉ ? Bạn có thể giải thích cho mình không ?
    ma trận nghịch đảo của ma trận vừa nhập.
    Do mình chưa học về ma trận nên bạn có thể giải thích thế nào là nghịch đảo không ? 1 ví dụ cũng được ?

  4. #4
    Ngày gia nhập
    12 2007
    Bài viết
    10

    Bạn ơi, định thức ma trận là thế này:
    1. Ma trận là một bảng có m hàng, n cột(m, n >=1). Thầy mình bảo là lưu nó vào một ma trận 2 chiều ( nhưng mảng lại có chỉ số chạy từ 0).

    2. Ma trận vuông là ma trận có m =n( số này đc gọi là cấp của ma trận vuông), nó có định thức (kí hiệu: det) đc tính như sau:
    2.1 Nếu m = n = 1:kí hiệu ma trận là A, khi này A chỉ có một phần tử a11 (tức là phần tử a thuộc A có m =1, n=1). Ma trận này có định thức như sau:

    det(A) = a11

    2.2 Nếu m = n = 2: khi này A có 4 phần tử như sau:
    a11 a12
    a21 a22

    và det(A) = a11*det(M11) - a12*det(M12)

    Trong đó Mij đc giải thích là: trong một ma trận vuông A bất kì cấp n, ta bỏ đi hàng i và cột j của ma trận đó thì ta đc một ma trận mới có n-1 hàng, và n-1 cột, tức là cấp n-1, ma trận này đc kí hiệu là Mij, gọi là ma trận con ứng với phần tử a ij (a ij là phần tử a thuộc A có m = i, n= j).
    Trong trường hợp này thì M11 là a22 (do bỏ hàng 1, cột 1), M12 là a21.
    2.3 Tổng quát với A là ma trận cấp n (định thức chỉ có ở ma trận vuông)thì:

    det(A) = a11*det(M11) - a12*det(M12) +...+ pow(-1, 1+n)*a1n*det(M1n)

    với chú ý là a11, a12, ...,a1n là các phần tử cùng nằm ở hàng 1 của ma trận A.
    Khái niệm ma trận nghịch đảo và cách tính của nó khá dài nhưng cũng có liên quan tới định thức. Có lẽ mình nhờ bạn phần định thức còn phần ma trận nghịch đảo mình có thể dựa vào đó để làm. Rất cám ơn bạn!
    Đã được chỉnh sửa lần cuối bởi valiant-man : 05-12-2007 lúc 04:34 PM.

  5. #5
    Ngày gia nhập
    10 2007
    Bài viết
    4

    Bạn Valiant Man này,làm như thế cũng được.Trước đây tớ cũng dùng phương pháp này.Nhưng phương pháp độ phức tạp hơi lơn vì vậy chương trình chạy không nhanh.Nếu bạn dung phương pháp Gauss-Jordan thì sẽ tốt hơn nhiều.Cụ thể bạn có thể xem trong sách Đại số tuyến tính.

  6. #6
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định Định thức và ma trận nghịch đảo của ma trận

    Nếu bạn dung phương pháp Gauss-Jordan thì sẽ tốt hơn nhiều.Cụ thể bạn có thể xem trong sách Đại số tuyến tính.
    Hic, cái này hồi đó học đồ họa 3D bị dính. Vẫn chưa tìm được cách code. Bạn làm được thì post lên cho mọi người tham khảo với
    Keep moving forward!

    ... Retired ...

  7. #7
    Ngày gia nhập
    10 2007
    Bài viết
    4

    Đây là code bài toán trên.Tớ viết bằng trên VC++.Nên nếu dịch trên TC thì các bạn sửa lại một chút ở thư viện stdafx.h thanh stdio.h và thu nhỏ cỡ ma trận là được.Chúc các bạn luôn gặt hái thành công trong công việc học tập .Tớ hy vọng được các chỉ bảo thêm đê có thể tiến bộ bắt kịp các bạn
    Code:
    // ma tran.cpp : Defines the entry point for the console application.
    //
    
    #include "StdAfx.h"
    #include <conio.h>
    
    int i,j,na,n;
    double a[100][100],b[100][100];
    
    void doicho(int i1,int i2);
    void cong(int i1,int i2,double x);
    void matran();
    
    void doicho(int i1,int i2)
    { int j;
      double tg;
      for(j=1;j<=na;j++)
      { tg=a[i1][j];
        a[i1][j]=a[i2][j];
    	a[i2][j]=tg;
      }
    }
    // ham dung de nhan hang i1 voi x roi cong vao hang i2 trong ma tran.
    void cong(int i1,int i2,double x)
    { int j;
      for(j=1;j<=na;j++) a[i2][j]=a[i2][j]+a[i1][j]*x;
    }
    // ham dung giai phuong trinh.
    void matran()
    { int i,j,k;
      double x,det;
     
      for(j=1;j<=n;j++)
      {
        for(i=n;i>=j;i--)
    	{ if(a[i][j]==0) continue;
    	  if((i>j)&&(a[i][j]!=0))
    	  { k=i-1; 
    	    while((k>=j)&&(a[k][j]==0)) k--;
    		if(k<j) doicho(i,j);
    		if((k>=j)&&(k>=1))
    		{  x=-a[i][j]/a[k][j]; 
    		   cong(k,i,x);
            }
    	  }
    	}
      }
      for(j=n;j>=1;j--)
      {
        for(i=1;i<=j;i++)
    	{ if(a[i][j]==0) continue;
    	  if((i<j)&&(a[i][j]!=0))
    	  { k=i+1;
    	    while((k<=j)&&(a[k][j]==0)) k++;
    		if((k<=j)&&(k<=na))
    		{ x=-a[i][j]/a[k][j];
    		  cong(k,i,x);
    		}
    	  }
    	}
      } 
      // tinh dinh thuc
        det=1;
      for(i=1;i<=n;i++)
    	  for(j=1;j<=n;j++)
    		  if(i==j) det=det*a[i][j];
              printf("\n det=%f",det);
        // tinh ma tran nghich dao.
      if(det!=0)
      {
       for(i=1;i<=n;i++)
    	  for(j=n+1;j<=na;j++)
    	  {
             a[i][j]=a[i][j]/a[i][i]; 
    	  }
       for(i=1;i<=n;i++)
    	  for(j=n+1;j<=na;j++) 
    	  {
    		  b[i][j-n]=a[i][j];
    	  }
       // ma tran nghich dao
    	 printf("\n ma tran nghich dao:\n");
       for(i=1;i<=n;i++)
       {
    	  for(j=1;j<=n;j++) printf(" %-5lf ",b[i][j]);
    	  printf("\n");
       }
     }
     else printf("\n khong co ma tran nghich dao");
    }
    
    
    main()
    { double tg;
        
        printf("\n n="); scanf("%d",&n);
        na=2*n;
    	for(i=1;i<=n;i++)
    		for(j=1;j<=n;j++)
    		{ printf("\n a[%d][%d]=",i,j);scanf("%lf",&tg);
    		  a[i][j]=tg;
    		}
        // tao ma tran lien ket
        for(i=1;i<=n;i++)
    		for(j=n+1;j<=na;j++)
    		{
    		  if(i==(j-n)) a[i][j]=1;
    		  else a[i][j]=0;
    		}
       
    	matran();
    	
    	getch();
    	return 0;
    }
    Đã được chỉnh sửa lần cuối bởi le minh nghia : 06-12-2007 lúc 08:55 PM.

  8. #8
    Ngày gia nhập
    12 2007
    Bài viết
    10

    Thank bạn! Dài quá nên mình chưa hiểu đc, sẽ cố gắng đọc

  9. #9
    Ngày gia nhập
    08 2009
    Bài viết
    11

    Khi chạy, dòng này báo lỗi (over - too size)

    Code:
    double a[100][100],b[100][100];
    Và khi sửa, thì chạy được nhưng kq sai, chắc trong lập trình có chỗ nào đó sai thui. Cám ơn bạn nhiều nhé :X

  10. #10
    Ngày gia nhập
    01 2010
    Bài viết
    16

    ctrinh đúng rồi bạn à. Không sai đâu. Mình chạy trên DevC++ ngon lành

Các đề tài tương tự

  1. Chương trình ưu đãi “công nghệ trao tay, học ngay nghề hot”
    Gửi bởi April91 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 25-04-2013, 10:45 PM
  2. Trần nhôm INNOMAX # 04.37832347 – Trần kim loại – Tấm trần nhôm – Xương trần nhôm
    Gửi bởi soiconhuli trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 16-03-2011, 11:32 AM
  3. Trần nhôm INNOMAX – Trần kim loại – Tấm trần nhôm – Xương trần nhôm
    Gửi bởi soiconhuli trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 18-05-2010, 08:40 PM
  4. Bài tập C++ Tính toán ma trận nghịch đảo. Xử lý ma trận?
    Gửi bởi hoan_it_cgh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 10-04-2010, 09:21 AM
  5. Ma trận nghịch đảo
    Gửi bởi lyngocho trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 16-04-2008, 01:19 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn