Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 12
  1. #1
    Tham gia
    29-04-2008
    Bài viết
    13
    Like
    0
    Thanked 0 Times in 0 Posts

    Thông tin Ma trận nghịch đảo

    Các pác giup mình viết đoạn code ve ma trận nghịch đảo với phân tích chút it nửa nha .Ông thầy bắt làm thuyêt trình bài này ,mình kiếm nhiều ngày rùi may ko dc gì hết
    Quote Quote

  2. #2
    Tham gia
    26-01-2008
    Bài viết
    359
    Like
    0
    Thanked 3 Times in 3 Posts
    Bạn xem qua bên dưới, còn thuật toán thì bạn lên đọc qua sách, tính ma trận nghịch đảo có nhiều thuật toán.

    Code:
    void MatAlgebra(double **x,double **a)
    {
    	int i,j,k;
    	double Sum,m;
    	double **b, **q;
    	b=new double *[N+1];
    	q=new double *[N+1];
    	for (i=1; i<=N; i++)
    	{
    		b[i] = new double [N+1];
    		q[i] = new double [N+1];
    	}
    	for (i = 1; i <= N;i++)
    		for (j = 1; j <= N;j++)
    		{
    			b[i][j] = 0;
    			q[i][j] = a[i][j];
    			if (i == j)
    				b[i][j] = 1;
    		}
    	// Perform row operations
    	for (k = 1;k <= N-1;k++)
    		for (i = k+1;i <= N;i++)
    		{
    			m = q[i][k]/q[k][k];
    			for (j = 1;j <= N;j++)
    			{
    				q[i][j] -= m*q[k][j];
    				b[i][j] -= m*b[k][j];
    			}
    		}
    }

  3. #3
    Tham gia
    29-04-2008
    Bài viết
    13
    Like
    0
    Thanked 0 Times in 0 Posts

    Thông tin

    void MatAlgebra(double **x,double **a)
    {
    int i,j,k;
    double Sum,m;
    double **b, **q;
    b=new double *[N+1];
    q=new double *[N+1];
    for (i=1; i<=N; i++)
    {
    b[i] = new double [N+1];
    q[i] = new double [N+1];



    mấy chỗ khai bào này ko hiểu
    (double **x,double **a)
    double sum,m;
    double **b,**q;
    b=new double *[N+1];
    q=new double *[N+1};
    b[i] = new double [N+1];
    q[i] = new double [N+1];


    những khai bào này mình chưa học qua nữa
    new double ?????????

  4. #4
    Tham gia
    26-01-2008
    Bài viết
    359
    Like
    0
    Thanked 3 Times in 3 Posts
    Sử dụng C chuẩn thì bạn tham khảo cách cấp phát bộ nhớ cho mảng hai chiều với malloc mình viết tại đây:http://ddth.com/showthread.php?t=181612 .

    Để hiểu thêm về tính ma trận nghịch đảo và lý thyết bạn có thể search với từ khóa "inverse matrix algorithm".

  5. #5
    Tham gia
    29-04-2008
    Bài viết
    13
    Like
    0
    Thanked 0 Times in 0 Posts
    ý minh hỏi là khi 1 ma tran A rùi xuất ra ma tran A này ,sau đó mình muon xuất ra ma trận nghịch đảo của A đó
    phải viết code như thế nào
    giải thuật nó ra làm sao
    cam on

  6. #6
    Tham gia
    26-01-2008
    Bài viết
    359
    Like
    0
    Thanked 3 Times in 3 Posts
    Những bài kiểu này thuộc môn chuyên ngành, mình đã nói rồi nếu bạn muốn học, muốn biết thì bạn phải đọc sách, tìm hiểu các giáo trình... có rất nhiều thuật toán tính ma trận nghịch đảo như Gauss, Cholesky... nó thuộc về bộ môn giải tích số. Vậy để hiểu về thuật toán tìm cuốn "Giáo trình giải tích số" (của tác giả nào cũng được - có thể dùng quyển của Phạm Kỳ Anh - ĐHQGHN), chứ trình bày cả cái thuật toán lên đây thì loằng ngoằng với lại ai có thời gian viết như vậy cho bạn.

    Mình code lại hoàn chỉnh thuật toán tìm ma trận nghịch đảo trên bằng stand C, chạy ổn rồi đấy, bạn cứ xem kỹ nó đi :

    PHP Code:
    #include <stdio.h>
    #include <conio.h>
    #include <malloc.h>
    #include <stdlib.h>

    #define N 4

    void main()
    {
        
    int i,j,k;
        
    double Sum,m;
        
    double **A, **B, **X;

        
    //

        
    = (double**) malloc( (N+1)*sizeof(double*));
        
    = (double**) malloc( (N+1)*sizeof(double*));
        
    = (double**) malloc( (N+1)*sizeof(double*));
        
        for (
    i=1;i<=N;i++)
        {
            
    A***91;i***93; = (double*) malloc( (N+1)*sizeof(double));
            
    B***91;i***93; = (double*) malloc( (N+1)*sizeof(double));
            
    X***91;i***93; = (double*) malloc( (N+1)*sizeof(double));
        }

        
    // Input value for matrix A and B where B is unit matrix

        
    for (1;<= Ni++)
            for (
    1;<= Nj++)
            {

                
    printf("A***91;%d***93;***91;%d***93; = ",i,j);
                
    scanf("%f",&A***91;i***93;***91;j***93;);

                if (
    == j)
                    
    B***91;i***93;***91;j***93; = 1;
                else
                    
    B***91;i***93;***91;j***93; = 0;
            }

            
    // row operations
            // Start algorithm

            
    for (1;<= N-1k++)
                for (
    k+1;<= Ni++)
                {
                    
    A***91;i***93;***91;k***93; / A***91;k***93;***91;k***93;;
                    for (
    1;<= Nj++)
                    {
                        
    A***91;i***93;***91;j***93; -= m*A***91;k***93;***91;j***93;;
                        
    B***91;i***93;***91;j***93; -= m*B***91;k***93;***91;j***93;;
                    }
                }

            
    // backward substitutions

            
    for (N;>= 1i--)
                for (
    1;<= Nj++)
                {
                    
    Sum 0;
                    
    X***91;i***93;***91;j***93; = 0;
                    for (
    i+1;<= Nk++)  Sum += A***91;i***93;***91;k***93;*X***91;k***93;***91;j***93;;                        
                    
    X***91;i***93;***91;j***93; = (B***91;i***93;***91;j***93; - Sum) / A***91;i***93;***91;i***93;;
                }

            
    // End of the algorithm !!!!
            // Print out the resul, you can do anything you want here !

            
    for (1;<= Ni++)
            {
                for (
    1;<= Nj++) printf("%f\t",X***91;i***93;***91;j***93;);                
                
    printf("\n");
            }

            
    // free memory

            
    for (i=1;i<=N;i++)
            {
                
    free(A***91;i***93;);
                
    free(B***91;i***93;);
                
    free(X***91;i***93;);
            }
            
    free(A);
            
    free(B);
            
    free(X);

            
    getch();


  7. #7
    Tham gia
    11-06-2008
    Bài viết
    1
    Like
    0
    Thanked 0 Times in 0 Posts
    thank you
    very much

  8. #8
    Tham gia
    18-11-2008
    Bài viết
    8
    Like
    0
    Thanked 0 Times in 0 Posts
    cho mình hỏi , cái này "double **b" có nghĩa là gì? Sao lại có 2 dấu * ở đây?
    thankS !!

  9. #9
    Tham gia
    04-02-2009
    Location
    HCM
    Bài viết
    270
    Like
    0
    Thanked 2 Times in 2 Posts
    Quote Được gửi bởi thientran89 View Post
    cho mình hỏi , cái này "double **b" có nghĩa là gì? Sao lại có 2 dấu * ở đây?
    thankS !!
    http://www.ddth.com/showthread.php?t=181612&page=2

  10. #10
    Tham gia
    15-10-2009
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    ban nao co code giai he phuong trinh bang phuong phap grauss viet bang c# chi min voi hoac gui cho minh wa mail.hoaquynhanhphm@gmail.com min cam on cac ban nhieu min chua giai dc

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

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