首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

矩阵的幂演算

2013-07-08 
矩阵的幂运算定义的那个矩阵幂运算的递归函数似乎不能正确递归,想了半天也不知问题出在何处,望各位大哥予

矩阵的幂运算
定义的那个矩阵幂运算的递归函数似乎不能正确递归,想了半天也不知问题出在何处,望各位大哥予以指点,在此谢谢了!
代码:


#include "stdafx.h"
#include<stdio.h>
#include<iostream>
using namespace std;
#define N 6

struct matrix
{
int t[N][N];

};
matrix w,ee,a;
matrix mi(matrix a,int nn)
{
int i,j;
int kk;
if(1==nn)
return w;
for(i=1;i<N;i++)
for(j=1;j<N;j++)
for(kk=1;kk<N;kk++)
ee.t[i][j]+=w.t[i][kk]*a.t[kk][j];
for(i=1;i<N;i++)
for(j=1;j<N;j++)
w.t[i][j]=ee.t[i][j];

return mi(w,--nn);

}

int _tmain(int argc, _TCHAR* argv[])
{

matrix result;


int i,j;int k,l,step;
int p,q;

for(i=1;i<=N;++i)       //输入前的矩阵清零
for(j=1;j<=N;j++)
a.t[i][j]=0;

while(scanf_s("%d %d",&p,&q))   // 图的输入  以 0 0 标志结束输入
{
if((p==0)&&(q==0))
break;
else
a.t[p][q]=a.t[q][p]=1;
}
for(i=1;i<N;i++)
for(j=1;j<N;j++)
w.t[i][j]=a.t[i][j];

for(i=1;i<N;++i) 
{
for(j=1;j<N;j++)
printf("%d ",a.t[i][j]);printf("\n");
}
while(1)
{
printf("k to l in s steps \n such as k l steps\n");

cin>>k>>l>>step;

result=mi(a,step);
printf("there %d paths for %d to %d .\n",result.t[k][l],k,l);
for(i=1;i<N;++i) 
{
for(j=1;j<N;j++)
printf("%d ",w.t[i][j]);printf("\n");
}

}

return 0;
}
递归 C 矩阵 struct
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

------解决方案--------------------


你这个矩阵幂好像完全不对吧。。我写了个简单的你看看。。


matrix multi(matrix a, matrix b){
matrix c;
for(int i = 1; i < N; ++i) for(int j = 1; j < N; ++j) c[i][j] = 0;
for(int i = 1; i < N; ++i){
for(int j = 1; j < N; ++j){
for(int k = 1; k < N; ++k){
c.t[i][j] += a.t[i][k] * b.t[k][j];
}
}
}
return c;
}
matrix mi(matrix a,int nn)
{
if(nn == 1) return a;
matrix tt = mi(a, nn / 2);
tt = multi(tt, tt);
if(nn % 2) return multi(tt, a);
return tt;
}


还有开始对a清0那里应该是<N。。不是<=。。否则会越界。。
[解决办法]
“多一少一”问题占程序员常犯错误的10%以上!

[解决办法]
有的问题想不出来,那就得动手了

热点排行