| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3461 人关注过本帖
标题:矩阵相乘运算
取消只看楼主 加入收藏
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:9 
矩阵相乘运算
      三个矩阵A,B,C,其中A=B*C;已知A为1行5列,B为1行15列,C为15行5列;现在已知矩阵A和矩阵C,用c语言求出矩阵B。如:A=(0 0 1 1 0),C=(0 0 0 0 0
             0 0 0 0 0
             0 0 0 0 0
             0 0 0 0 0
             0 0 0 0 0
             1 0 0 0 0
             0 1 0 0 0
             1 0 1 0 0
             0 1 0 1 0
             1 0 1 0 1
             1 0 0 0 0
             0 1 0 0 0
             0 0 1 0 0
             0 0 0 1 0
             0 0 0 0 1).
搜索更多相关主题的帖子: c语言 
2011-09-24 09:56
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
回复 2楼 pangding
    这个还真不知道怎么求,你讲讲……
2011-09-24 12:51
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
回复 4楼 TonyDeng
    有个程序里面涉及到这个模块,所以逃避不了的,这是我们的实验程序,我现在就只剩这个矩阵求解了……实在求不出来
2011-09-24 13:18
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
回复 7楼 TonyDeng
    这个已知矩阵A,B,求C=A*B我知道怎么求,但是已知C,B,从而求解矩阵A,而且B并不是n阶阵,不能求逆运算,所以不知道怎么得到矩阵A。
2011-09-24 13:32
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
回复 8楼 TonyDeng
    现在在读研,正在做2/3FEC编译码程序,需要求得错误图样E,其中E是个1*15的矩阵,也可以称为向量;S=E*H^T(H^T为矩阵H的转置),我已经求出了S和H^T,需要根据这两个解得的矩阵来求解E,其中H^T为15*5的矩阵;
2011-09-24 13:37
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
回复 11楼 TonyDeng
    你能不能解决啊,我本科是学数学的,现在好久没接触,很多基础东西都忘了,真是惭愧啊……
2011-09-24 13:53
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
回复 13楼 pangding
    能给个联系方式吗?我把程序发给你,你帮我看下,好吗?
2011-09-24 14:12
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
回复 17楼 pangding
    13楼的思路我明白,我的盲区在于怎么用c语言实现线性方程组的求解,而且该线性方程组的方程个数要小于变元数,我大致算了下,这个方程组解不唯一;还有由于里面的系数都是非0即1,所以其实它的加法是模2加的,即:1+1=0,0+1=1;
2011-09-24 14:29
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
    我将程序附上来吧,可能有点冗长,大家帮忙看下:
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int r[5];
/*************多项式相乘模块****************/
void pmul(int k[],int x,int t[],int y,int n[],int z)
{
    int i,j;
    for(i=0;i<z;i++)
        n[i]=0;
    for(i=0;i<x;i++)
        for(j=0;j<y;j++)
            n[i+j]=n[i+j]+k[i]*t[j];
    return;
}
/*************多项式相除模块**************/
void pdiv(int n[],int x,int m[],int y,int r[],int l)
{
    int i,k;
    for(i=x-1;i>=0;i--)
        if(n[i]!=0)
        {
            k=i;
            printf("%d\n",k);
            break;
        }
    while(k>=5)
    {
        for(i=k;i>=k-5;i--)
        {
            n[i]=n[i]^m[y-1-k+i];
        }
        for(i=k;i>=k-5;i--)
            if(n[i]!=0)
            {
                k=i;
//                printf("%d\n",k);
                break;
            }
    }
    for(i=l-1;i>=0;i--)
        r[i]=n[i];
    return;
}
void main()
{
    int i,j,z;
    char flag='Y';
    while(flag=='Y')
    {
        int n[15];//整个码长,用于存放多项式相乘后各项的系数.
        int k[10];//信息码系数数组.
        int t[6]={0,0,0,0,0,1};//与信息码多项式相乘的多项式的各项的系数,即x^5.
        FILE *fp;
        fp=fopen("a.txt","w");
        srand(time(0));
        printf("The Cofficient of the information code is: \n");
        for(i=0;i<10;i++)
        {
            k[i]=rand()%2;
            printf("%d",k[i]);
        }
        printf("\n");
        pmul(k,10,t,6,n,15);//多项式相乘模块的调用.
        printf("The Cofficient of the total code is: \n");
        for(i=0;i<15;i++)
        {
            printf("%d",n[i]);
            fprintf(fp,"%d",n[i]);
        }
        fprintf(fp,"\n");
        printf("\n");
        fclose(fp);
        int m[6]={1,0,1,0,1,1};
//        static int r[5];
        pdiv(n,15,m,6,r,5);//多项式相除模块的调用.
        printf("The Cofficient of the array r is: \n");
        for(i=0;i<=4;i++)
            printf("%d",r[i]);
        printf("\n");
        /**********将文件中的数据读出来**********/
        fp=fopen("a.txt","rb");
        printf("The Cofficient that we read from the file is: \n");
//        fscanf(fp,"%s",n);//读出文件中的二进制代码.
        for(i=0;i<15;i++)
        {
            if(fscanf(fp,"%c",&n[i])==EOF)//改为每次读出一个字符.
                break;
            printf("%c",n[i]);//同样以字符格式输出.
        }
        printf("\n");
        for(i=0;i<15;i++)
        {
            n[i]=n[i]-48;//将字符型转换成整形.
            printf("%d",n[i]);
        }
        printf("\n");
        fclose(fp);
        /**********将余多项式中的各项系数赋值给信息多项式中的系数************/
        for(i=0;i<=4;i++)
            n[i]=r[i];
        printf("The Cofficient that we need lastly is: \n");
        for(i=0;i<15;i++)
            printf("%d",n[i]);
        printf("\n\n");
        /*************对发送的码组加入误码,即定义为接收到的码组s[15]**************/
        int s[15];    //接收到的码组;
        printf("The Code Group that we recived is: \n");
        for(i=0;i<=4;i++)
            s[i]=n[i];
        for(i=5;i<=14;i++)
            s[i]=rand()%2;     //加入误码过程.
        for(i=0;i<=14;i++)
            printf("%d",s[i]);
        printf("\n");
        /************根据接收到的码组来解得校验子q[5]*************/
        int q[5];
        pdiv(s,15,m,6,q,5);        //调用多项式相除模块.
        printf("Calibration sub- is: \n");        //输出校验子.
        for(i=0;i<=4;i++)
            printf("%d",q[i]);
        printf("\n");
        /************根据求得的校验子来判别接收是否有误******************/
        for(i=0;i<=4;i++)
            if(q[i]!=0)
            {
                printf("The Code Group that we recived isn't equal to the Code Group that we sent.\n\n");
                break;
            }
        /************求生成矩阵G的多项式G(x)*******************/
        static int a[10];   //对x^i进行数组定义;
        int G[15];
        FILE *fp1;
        fp1=fopen("b.txt","w");        //将每一个生成的G(x)的系数数组输出到b.txt中;
        for(i=9;i>=0;i--)
        {
            a[i]=1;
            pmul(a,10,m,6,G,15);
            a[i]=0;                //每一次循环之后都要对a[10]重置0;
            for(j=14;j>=0;j--)
                fprintf(fp1,"%d ",G[j]);        //输出到文件中;
            fprintf(fp1,"\n");
        }
        fclose(fp1);
        fp1=fopen("b.txt","r");
        printf("The Matrix that we read from the file is: \n");
        int b[10][15];            //将生成矩阵G从文件读出来并存放在定义的矩阵b中;
        for(i=0;i<=9;i++)
        {
            for(j=0;j<=14;j++)
            {
                fscanf(fp1,"%d",&b[i][j]);
                printf("%d ",b[i][j]);
            }
            printf("\n");
        }
        fclose(fp1);
        /***********将生成矩阵G转换成典型生成矩阵b**************/
        for(i=9;i>=0;i--)
            for(j=i-1;j>=0;j--)
                for(z=0;z<=14;z++)
                {
                    if(b[j][i]==b[i][i])                //主要是消去对应位置上的1使其变为0;
                        b[j][z]=b[j][z]^b[i][z];
                }
        printf("The Matrix b that we convert from Matrix G is: \n");
        for(i=0;i<=9;i++)
        {
            for(j=0;j<=14;j++)
                printf("%d ",b[i][j]);
            printf("\n");
        }
        /***********将典型生成矩阵转换成监督矩阵H**************/
        int c[10][5],d[5][10];
        printf("The Matrix Q is: \n");
        for(i=0;i<=9;i++)
        {
            for(j=10;j<=14;j++)
            {
                c[i][j-10]=b[i][j];
                printf("%d ",c[i][j-10]);
            }
            printf("\n");
        }
        printf("The Matrix P is: \n");
        for(i=0;i<=4;i++)
        {
            for(j=0;j<=9;j++)
            {
                d[i][j]=c[j][i];
                printf("%d ",d[i][j]);
            }
            printf("\n");
        }
        printf("The Monitoring Matrix H is: \n");
        int H[5][15];
        for(i=0;i<=4;i++)
        {
            for(j=0;j<=9;j++)
                H[i][j]=d[i][j];
            for(j=10;j<=14;j++)
            {
                if((i+10)==j)
                    H[i][j]=1;
                else
                    H[i][j]=0;
            }
        }
        for(i=0;i<=4;i++)
        {
            for(j=0;j<=14;j++)
                printf("%d ",H[i][j]);
            printf("\n");
        }
        /*************求解错误图样E:其中q[]=E[]*D(未完成)***************/
        printf("The Transpose of Matrix H is: \n");
        int D[15][5],E[15];
        for(i=0;i<=14;i++)
        {
            for(j=0;j<=4;j++)
            {
                D[i][j]=H[j][i];
                printf("%d ",D[i][j]);
            }
            printf("\n");
        }
        printf("Do you want to continue?If yes,press Y,if not,press N.\n");
        scanf("%c",&flag);
        getchar();
        if(flag=='Y')
            continue;
        else break;
    }
}


2011-09-24 14:33
c821101017
Rank: 2
等 级:论坛游民
帖 子:33
专家分:10
注 册:2011-9-21
收藏
得分:0 
回复 21楼 TonyDeng
    呵呵,何出此言啊,这的确是个矩阵求解的问题啊,只是系数以及运算规则有些特殊而已……
2011-09-24 14:51
快速回复:矩阵相乘运算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023309 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved