PDA

View Full Version : Tính định thức của ma trận cấp n dùng đệ qui , giúp em với,gấp!!



pixeleyes360
21-05-2009, 10:01 PM
Em có một bài toán về tính định thức của ma trận vuông cấp n dùng đệ qui để viết code , em đã viết như thế này , chạy thử mà chưa đúng , suy nghĩ mãi kiểu đệ qui vẫn không ra (:=(|) , mong mọi người post giùm em đoạn code , hoặc sửa code cho em,có chú thích luôn thì tốt quá(viết theo C hoặc C++ cũng được) mong mọi người giúp em với. Cảm ơn thật nhiều!!
:)

int detmt(int A[][100],int n)
{int x;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
x=A[i][j]*pow(-1,j +1)*detmt(A,n);
return x;
}

minhgiang_hedspi
21-05-2009, 11:28 PM
bạn phải cho 3 biến nhập vào xác định tọa độ của điểm đầu tiên ma trận con và kích thước của nó.rồi đệ quy tiếp tục.sử dụng y hệt trong SGK

pixeleyes360
22-05-2009, 10:21 PM
vậy là em phải sửa thành thế này


int detmt(int A[][100],int n)
{int x;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
x=A[0][j]*pow(-1,j +1)*detmt(A,n);
return x;
nhưng vẫn mò mãi chưa ra , mọi người giúp code với ,em bó tay rồi thứ 2 này phải nộp bài rồi. Mà sgk nào vậy minhgiang_hedspi , nói sgk mình ko biết đó là sgk gì hết T_T

minhgiang_hedspi
22-05-2009, 10:32 PM
ơ,sgk toán cao cấp mà.thì bạn thực hiện đệ quy như trong đó là được mà.để mình thử viết lại xem.

pixeleyes360
22-05-2009, 11:03 PM
tại vì mình kẹt ngay chỗ phần phụ đại số (cái phần nhân cho ma trận loại bỏ dòng k(cố định ) và cột j ấy) , ko biết làm sao ,mong bạn giải giùm mình nha , giải thích càng tốt ko thì code cũng đc mình tự suy ngẫm . sách giáo khoa mà bạn nói là sách nhà xuất bản , tác giả nào vì mình cũng có tham khảo nhưng hông thấy T_T , cảm ơn bạn thật nhiều!!

minhgiang_hedspi
23-05-2009, 12:02 AM
//tinh dinh thuc ma tran.
#include <stdio.h>
/*
ham nay thuc hien viec copy ma tran goc vao ma tran con bo di hang thu a, cot thu b
*/
void copy(float *in,float *out,int n,int a,int b){
int i,j,l,k;
for(i=0,l=0;i<n;i++) if(i!=a)
{
for(j=0,k=0;j<n;j++) if(j!=b){
*(out+l*10+k)=*(in+i*10+j);
k++;
printf("%.1f ",*(in+i*10+j));
}
l++;
printf("\n");
}
}
/*
ham tinh dinh thuc voi ma tran nhap vao co kich thuoc n*n
*/
float dinh_thuc(float *array,int n){
int i,j=-1;
float tg=0;
float tmp[10][10][10];
if(n==0) return 1;//khi kich thuoc =0 tra ve 1.
//print(&tmp[i][0][0],n-1);
for(i=0;i<n;i++) {
j*=-1;
copy(array,&tmp[i][0][0],n,0,i);//thu nho ma tran.
//print(&tmp[i][0][0],n-1);
tg+=*(array+i)*(j) * dinh_thuc(&(tmp[i][0][0]),n-1);//thuc hien de quy o day
}
return tg;

}

int main(){
float array[10][10]={{1,2,3},{4,5,6},{7,8,9}};
float a[10][10];
printf("%f",dinh_thuc((float*)array,3));
//copy((float*)array,(float*)a,3,0,0);
}

hixxx việc truyền tham số cho hàm là mảng nhiều lúc rắc rối quá nên giờ mới xong

minhgiang_hedspi
23-05-2009, 12:05 AM
phần phụ đại số, loại bỏ côt i, dòng j thì mình có 2 cách xử lý:
:cách thứ nhất ứng với mỗi bước đệ quy mình truyền thêm 2 màng 1 chiều chứa các cột dòng cần loại bỏ
:cách thứ 2 tạo các mảng phụ bên trong hàm và truyền trực tiếp.
mỗi cách có cái hay của nó,va mình chọn cách 1.

pixeleyes360
23-05-2009, 12:44 AM
bạn minhgiang_hedspi ơi bạn giải thích giùm kĩ mình chỗ này nha , mình chưa hỉu chỗ này :

for(j=0,k=0;j<n;j++) if(j!=b){
*(out+l*10+k)=*(in+i*10+j);
k++;
printf("%.1f ",*(in+i*10+j));
}

và biến tạm mà dùng mảng ở đây nũa :

float tmp[10][10][10];

phiền bạn 1 chút nữa thui nhé ,cám ơn bạn nhiều ,bạn pro ghê. :)

minhgiang_hedspi
23-05-2009, 10:31 PM
vòng for đó đưa ra mảng out sau khi đã loại bỏ các hàng và cột a,b.
biến tạm là gồm 10 mảng 2 chiều 10*10.
vì chưa học cấp phát động nên mình phải làm thủ công như thế.hjjjj

khanh120
27-05-2009, 09:18 AM
thử viết 1 hàm đệ quy riêng trả về tổng sau đó gọi hàm thử xem (:-)??

minhgiang_hedspi
27-05-2009, 12:16 PM
bạn nói j mình không hiểu