| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2021 人关注过本帖
标题:求助C语言编程求解矩阵的根
只看楼主 加入收藏
雾城谜梦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-11-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
求助C语言编程求解矩阵的根
用C语言编程求解一个3*4矩阵的根,只用最基础的就可以。由于初学C语言,根本不懂如何编程,希望有人帮帮我。
搜索更多相关主题的帖子: C语言 如何 
2016-11-19 15:23
雾城谜梦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-11-19
收藏
得分:0 
x+y+z=7
2x+y-z=5
x-y-2z=4
2016-11-19 15:35
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
程序代码:
#include <stdio.h>

int value(int sa[3][4], int a, int b, int c)
{
    int t[3][3] = {{sa[0][a], sa[0][b], sa[0][c]}, {sa[1][a], sa[1][b], sa[1][c]}, {sa[2][a], sa[2][b], sa[2][c]}};
    return t[0][0] * t[1][1] * t[2][2] + t[0][1] * t[1][2] * t[2][0] + t[0][2] * t[1][0] * t[2][1] -
           t[0][0] * t[1][2] * t[2][1] - t[0][1] * t[1][0] * t[2][2] - t[0][2] * t[1][1] * t[2][0];
}

int main(void)
{
    int a[3][4] = {{1, 1,  1,  7},
                   {2, 1,  -1, 5},
                   {1, -1, -2, 4}};

    int d = value(a, 0, 1, 2);
    printf("%d\n", d);

    if (!d)
    {
        printf("No Answer\n");
        return -1;
    }
    int dx = value(a, 3, 1, 2);
    int dy = value(a, 0, 3, 2);
    int dz = value(a, 0, 1, 3);

    printf("x = %lf, y = %lf, z = %lf\n", dx * 1.0 / d, dy * 1.0 / d, dz * 1.0 / d);

    return 0;
}
收到的鲜花
  • 雾城谜梦2016-11-20 09:29 送鲜花  3朵   附言:好文章,实力很强


[fly]存在即是合理[/fly]
2016-11-19 18:41
雾城谜梦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-11-19
收藏
得分:0 
回复 3楼 azzbcc
感谢大神,十分感谢,但我们要用的是高斯消元法,(最开始没写清楚,不好意思)您写的这个太高深了,我作为一个外行看不懂,望大神用高斯消元法赐教。
再次感谢。
2016-11-20 09:26
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:10 
#include <stdio.h>

int main()
{
    double a[3][4]={1,1,1,7,2,1,-1,5,1,-1,-2,4};
    double m=1,n=1;
    for(int i=0;i<3;++i)                        
    {
        for(int j=i+1;j<3;++j)            
        {
            m=1;
            n=1;
            if(a[i][i]!=a[j][i])
            {
                m=a[j][i];               
                n=a[i][i];                 
                for(int k=0;k<4;++k)
                {
                    a[i][k]*=m;
                    a[j][k]*=n;
                }
            }
            for(int k=0;k<4;++k)
            {
                a[j][k]=a[i][k]-a[j][k];
                a[i][k]/=m;
            }            
        }
    }
    for(int i=2;i>0;--i)            
    {
        for(int j=i-1;j>=0;--j)            
        {
            m=1;
            n=1;
            if(a[i][i]!=a[j][i])
            {
                m=a[j][i]*-1;
                n=a[i][i]*-1;                 
                for(int k=0;k<4;++k)
                {
                    a[i][k]*=m;
                    a[j][k]*=n;
                }
            }
            for(int k=0;k<4;++k)
            {
                a[j][k]=a[i][k]-a[j][k];
                a[i][k]/=m;
            }            
        }
    }
    for(int i=0;i<3;++i)        //输出矩阵内的值
    {
        for(int j=0;j<4;++j)
            printf("%g\t",a[i][j]);
        printf("\n");
    }
    for(int i=0;i<3;++i)        //输出各未知道数的根
        printf("%g\t",a[i][3]/a[i][i]);
    return 0;
}
2016-11-20 13:51
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
这个代码是错误的,内部对 0行的处理考虑不足。

程序代码:
#include <stdio.h>

#define ROW 3
#define COL (ROW + 1)

int print(int (*sa)[COL])
{
    printf("Array:\n");
    for (int i = 0; i < ROW; ++i)
    for (int j = 0; j < COL; ++j)
    {
        printf("%d%c", sa[i][j], j + 1 - COL ? '\t' : '\n');
    }
    printf("\n");
}

int getGcd(int a, int b)
{
    int tmp;
    while (b)
    {
        tmp = b;
        b = a % b;
        a = tmp;
    }
    return a;
}

int getLcm(int a, int b)
{
    if (!a) return b;
    if (!b) return a;
    return a / getGcd(a, b) * b;
}

int main(void)
{
    int a[ROW][COL] = {{1, 1,  1,  7},
                       {2, 1,  -1, 5},
                       {1, -1, -2, 4}};

    for (int line = 0; line < ROW; ++line)
    {
        int row = line;

        // 跳过已是0的行
        while (a[line][row] == 0 && row++ < ROW);

        if (row >= ROW)
        {
            printf("无解或无数解\n");
            return -1;
        }

        // 当前列剩余行转化为 0
        for (int i = 0; i < ROW; ++i)
        {
            if (i == row || !a[i][line]) continue;

            int lcm = getLcm(a[row][line], a[i][line]);
            int plus = lcm / a[i][line];

            for (int j = 0; j < COL; ++j)
            {
                a[i][j] *= plus;
                a[i][j] -= lcm / a[row][line] * a[row][j];
            }
        }

        print(a);
    }

    for (int i = 0; i < ROW; ++i)
    {
        printf("r%d = %lf\n", i + 1, a[i][3] * 1.0 / a[i][i]);
    }

    return 0;
}


[此贴子已经被作者于2016-11-20 21:48编辑过]



[fly]存在即是合理[/fly]
2016-11-20 14:43
雾城谜梦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-11-19
收藏
得分:0 
回复 5楼 linlulu001
很感谢你

[此贴子已经被作者于2016-11-20 20:38编辑过]

2016-11-20 20:31
雾城谜梦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-11-19
收藏
得分:0 
回复 5楼 linlulu001
大神,你是不是写程序的时候不太小心啊,出了好多错误,c99mode是什么意思??
2016-11-20 20:34
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
6楼的代码是错的,现在在外面,一会儿回去改一下。

。。。

就放这里吧。

程序代码:
#include <stdio.h>

#define ROW 3
#define COL (ROW + 1)

int print(int (*sa)[COL])
{
    printf("Array:\n");
    for (int i = 0; i < ROW; ++i)
    for (int j = 0; j < COL; ++j)
    {
        printf("%d%c", sa[i][j], j + 1 - COL ? '\t' : '\n');
    }
    printf("\n");
}

int getGcd(int a, int b)
{
    int tmp;
    while (b)
    {
        tmp = b;
        b = a % b;
        a = tmp;
    }
    return a;
}

int getLcm(int a, int b)
{
    if (!a) return b;
    if (!b) return a;
    return a / getGcd(a, b) * b;
}

int main(void)
{
    int a[ROW][COL] = {{0, -1, -3, -9},
                       {1, 1,  1,  7},
                       {0, -2, -3, -3}};

    for (int row = 0; row < ROW; ++row)
    {
        int tmp = row;

        // 跳过已是0的行
        while (a[row][tmp] == 0 && tmp++ < ROW);
        if (tmp >= ROW)
        {
            printf("无解或无数解\n");
            return -1;
        }

        // 交换row和line
        for (int col = 0; col < COL; ++col)
        {
            int tmpp = a[tmp][col];
            a[tmp][col] = a[row][col];
            a[row][col] = tmpp;
        }

        // 当前列剩余行转化为 0
        for (int i = 0; i < ROW; ++i)
        {
            if (i == row || !a[i][row]) continue;

            int lcm = getLcm(a[row][row], a[i][row]);
            int plus = lcm / a[i][row];

            for (int j = 0; j < COL; ++j)
            {
                a[i][j] *= plus;
                a[i][j] -= lcm / a[row][row] * a[row][j];
            }
        }

        print(a);
    }

    for (int i = 0; i < ROW; ++i)
    {
        printf("r%d = %lf\n", i + 1, a[i][3] * 1.0 / a[i][i]);
    }

    return 0;
}


[此贴子已经被作者于2016-11-20 21:50编辑过]



[fly]存在即是合理[/fly]
2016-11-20 20:37
雾城谜梦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-11-19
收藏
得分:0 
回复 9楼 azzbcc
谢谢你,真是好人,有几个是c99mode的错误,我不太懂,可不可以不用这个,只用最基本的就好,再次感谢。
2016-11-20 20:41
快速回复:求助C语言编程求解矩阵的根
数据加载中...
 
   



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

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