问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

二元域的高斯消元法C语言

发布网友 发布时间:2022-08-14 08:16

我来回答

2个回答

热心网友 时间:2024-10-27 12:42

// 自己写的,二元域没啥挑战性,还是弄正常的
// 有逆矩阵时返回,无时返回NULL

/*
    matrix.h
 */
#ifndef HEAD_matrix
#define HEAD_matrix

typedef struct matrix *Matrix;

Matrix createMatrix(long double *data, unsigned long length);
Matrix createIdentityMatrix(unsigned long length);
Matrix plicateMatrix(const Matrix trx);
void freeMatrix(Matrix trx);
Matrix caculateInversedMatrix(const Matrix trx);
const char *allocateDiscriptionOfMatrix(Matrix trx);

#endif

/*
    matrix.c
 */
 #include <stdlib.h>
#include <assert.h>
#include "matrix.h"

#define __nullable
#define __notnull

#define lineOfMatrix(trx, x) (trx->matrixData+trx->length*(x))
#define elementOfMatrix(trx, x, y) (lineOfMatrix(trx, x)[y])
#define BytesOfMatrixSize (sizeof(long double)*length*length)

struct matrix
{
unsigned long length;
long double matrixData[];
};

static void manipulateMatrixMutiplyK(Matrix trx, unsigned long lineIndex, long double __notnull k);
static void manipulateMatrixLineXMinusKTimesOfY(Matrix trx, unsigned long xLineIndex, long double __notnull k, unsigned long yLineIndex);
static unsigned long matrixLineNoneZeroCount(const Matrix trx, unsigned long columnIndex, unsigned long searchFromLineIndex);
static void manipulateMatrixSwapLineXY(Matrix trx, unsigned long xLineIndex, unsigned long yLineIndex);

const wchar_t *allocateDiscriptionOfMatrix(Matrix trx)
{
FILE *tempFilePointer = tmpfile();
static const wchar_t *format = L"Matrix %lux%lu\n";
unsigned long length = trx->length;
unsigned long stringLength = fwprintf(tempFilePointer, format, length, length);
for(unsigned long lineIndex = 0; lineIndex<length; lineIndex++)
{
//wcscat(result, L"[");
for(unsigned long elementIndexOfLine = 0; elementIndexOfLine<length; elementIndexOfLine++)
if(elementIndexOfLine+1==length)
stringLength += fwprintf(tempFilePointer, L"%5.4Lg", elementOfMatrix(trx, lineIndex, elementIndexOfLine));
else
stringLength += fwprintf(tempFilePointer, L"%5.4Lg, ", elementOfMatrix(trx, lineIndex, elementIndexOfLine));
//if(lineIndex+1 == length)
//wcscat(result, L"]");
//else
//wcscat(result, L"]\n");
}
stringLength += length*3-1;
char *result;
if((result = malloc(stringLength+1))!=NULL)
{
unsigned long indexOfResultOutput = 0;
indexOfResultOutput += swprintf(result, stringLength+1, format, length, length);
for(unsigned long lineIndex = 0; lineIndex<length; lineIndex++)
{
memcpy(result+indexOfResultOutput, L"[", sizeof(wchar_t)*2);
indexOfResultOutput += 2;
for(unsigned long elementIndexOfLine = 0; elementIndexOfLine<length; elementIndexOfLine++)
if(elementIndexOfLine+1==length)
indexOfResultOutput += swprintf(result+indexOfResultOutput, stringLength+1-indexOfResultOutput, L"%5.4Lg", elementOfMatrix(trx, lineIndex, elementIndexOfLine));
else
indexOfResultOutput += swprintf(result+indexOfResultOutput, stringLength+1-indexOfResultOutput, L"%5.4Lg, ", elementOfMatrix(trx, lineIndex, elementIndexOfLine));
if(lineIndex+1 == length)
{
memcpy(result+indexOfResultOutput, L"]", sizeof(wchar_t)*2);
indexOfResultOutput += 2;
}
else
{
memcpy(result+indexOfResultOutput, L"]\n", sizeof(wchar_t)*3);
indexOfResultOutput += 3;
}
}
}
fclose(tempFilePointer);
return result;
}

static unsigned long 

Matrix createMatrix(long double *data, unsigned long length)
{
if(length==0||data==NULL) return NULL;
Matrix result;
if((result=malloc(sizeof(struct matrix)+BytesOfMatrixSize)==NULL) return NULL;
memcpy(result->matrixData, data, BytesOfMatrixSize);
return result;
}

Matrix createIdentityMatrix(unsigned long length)
{
if(length==0) return NULL;
Matrix result;
if((result=malloc(sizeof(struct matrix)+BytesOfMatrixSize)==NULL) return NULL;
for(unsigned long index = 0; index<length; index++)
elementOfMatrix(result, index, index) = 1.0L;
return result;
}

Matrix plicateMatrix(const Matrix trx)
{
if(trx==NULL) return NULL;
Matrix result;
unsigned long length = trx->length;
if((result=malloc(sizeof(struct matrix)+BytesOfMatrixSize)==NULL) return NULL;
memcpy(result, trx, sizeof(struct matrix)+BytesOfMatrixSize);
return result;
}

void freeMatrix(Matrix trx)
{
free(trx);
}

/*FUNCTION: caculateInversedMatrix
 * SUCCEED: inversedMatrix
 *  FAILED: NULL
 *    INFO: if can't find it inversedMatrix return NULL
 */
Matrix caculateInversedMatrix(const Matrix trx)
{
if(trx==NULL) return NULL;
const unsigned long length = trx->length;
Matrix result = createIdentityMatrix(length);
Matrix modifiedMatrix = plicateMatrix(trx);

for(unsigned long lineIndex = 0; lineIndex < length; lineIndex++)
{
unsigned long searchForCurrentLineCount;
if((searchForCurrentLineCount = searchForCurrentLineCount(modifiedMatrix, lineIndex, lineIndex))==0)
{
freeMatrix(modifiedMatrix);
freeMatrix(result);
return NULL;
}
if(searchForCurrentLineCount-1!=lineIndex)
{
manipulateMatrixSwapLineXY(modifiedMatrix, lineIndex, searchForCurrentLineCount-1);
manipulateMatrixSwapLineXY(result, lineIndex, searchForCurrentLineCount-1);
}
for(unsigned long restLineIndex = lineIndex+1; restLineIndex<length; restLineIndex++)
if(elementOfMatrix(modifiedMatrix, restLineIndex, lineIndex)!=0.0L)
{
long double k = elementOfMatrix(modifiedMatrix, restLineIndex, lineIndex)/elementOfMatrix(modifiedMatrix, lineIndex, lineIndex);
manipulateMatrixLineXMinusKTimesOfY(modifiedMatrix, restLineIndex, k, lineIndex);
manipulateMatrixLineXMinusKTimesOfY(result, restLineIndex, k, lineIndex);
}
}
for(unsigned long lineCount = length; lineCount>0; lineCount--)
{
#ifdef lineIndex
#error lineIndex plicated definition as macro
#else
#define lineIndex (lineCount-1)

for(unsigned long restLineIndex = 0; restLineIndex<lineIndex; restLineIndex++)
if(elementOfMatrix(modifiedMatrix, restLineIndex, lineIndex)!=0.0L)
{
long double k = elementOfMatrix(modifiedMatrix, restLineIndex, lineIndex)/elementOfMatrix(modifiedMatrix, lineIndex, lineIndex);
manipulateMatrixLineXMinusKTimesOfY(modifiedMatrix, restLineIndex, k, lineIndex);
manipulateMatrixLineXMinusKTimesOfY(result, restLineIndex, k, lineIndex);
}
#undef lineIndex
#endif
}
for(unsigned long lineIndex = 0; lineIndex<length; lineIndex++)
if(elementOfMatrix(modifiedMatrix, lineIndex, lineIndex)!=1.0L)
{
long double k = 1/elementOfMatrix(modifiedMatrix, lineIndex, lineIndex);
//manipulateMatrixMutiplyK(modifiedMatrix, lineIndex, k);
manipulateMatrixMutiplyK(result, lineIndex, k);
}
freeMatrix(modifiedMatrix);
return result;
}

/*FUNCTION: matrixLineNoneZeroCount
 * SUCCEED: Count of line returned (not index)
 *  FAILED: Zero
 *    INFO:
 */
static unsigned long matrixLineNoneZeroCount(const Matrix trx, unsigned long columnIndex, unsigned long searchFromLineIndex)
{
assert(trx!=NULL);
assert(columnIndex < trx->length);
assert(searchFromLineIndex < trx->length);
for(unsigned long lineIndex = searchFromLineIndex; lineIndex < trx->length; lineIndex++)
if(elementOfMatrix(trx, lineIndex, columnIndex)!=0.0L) return lineIndex+1;
return 0;
}

static void manipulateMatrixMutiplyK(Matrix trx, unsigned long lineIndex, long double __notnull k)
{
assert(trx!=NULL);
assert(lineIndex < trx->length);
assert(k != 0.0L);
long double *thisLine = lineOfMatrix(trx, lineIndex);
for(unsigned long index = 0; index<trx->length; index++)
thisLine[index] = thisLine[index]*k;
}

static void manipulateMatrixLineXMinusKTimesOfY(Matrix trx, unsigned long xLineIndex, long double __notnull k, unsigned long yLineIndex)
{
assert(trx!=NULL);
assert(k!=0.0L);
assert(xLineIndex < trx->length);
assert(yLineIndex < trx->length);
long double *xLine = lineOfMatrix(trx, xLineIndex),
*yLine = lineOfMatrix(trx, yLineIndex);
for(unsigned long index = 0; index<trx->length; index++)
xLine[index] -= k*yLine[index];
}

static void manipulateMatrixSwapLineXY(Matrix trx, unsigned long xLineIndex, unsigned long yLineIndex)
{
assert(trx!=NULL);
assert(xLineIndex < trx->length);
assert(yLineIndex < trx->length);
long double *xLine = lineOfMatrix(trx, xLineIndex),
*yLine = lineOfMatrix(trx, yLineIndex);
for(unsigned long index = 0; index<trx->length; index++)
{
xLine[index] ^= yLine[index];
yLine[index] ^= xLine[index];
xLine[index] ^= yLine[index];
}
}

热心网友 时间:2024-10-27 12:42

//  
//Created By Kevin Feng  
//  
  
#include<stdio.h>  
#define MAX 10  
  
double A[MAX][MAX]; //系数矩阵  
double b[MAX];      //右端项  
double X[MAX];      //迭代向量  
int NUM;            //A的阶数  
int size;           //最大迭代次数  
  
  
  
int main(void)  
{  
    int i,j,k;     //计数器  
    float Aik;     //正消过程用到的变量名  
    float S;       //回代过程用到的变量名  
    //以下代码输入系数矩阵A,右端项b  
    printf("请输入系数矩阵A的阶数:");  
    scanf("%d",&NUM);;  
    size=NUM;  
    for(i=1;i<=size;i++)  
    {  
        printf("请输入A的第%d行元素,各元素间以空格间隔:\n",i);  
        for(j=1;j<=size;j++)  
            scanf("%lf",&A[i-1][j-1]);  
    }  
      
    printf("输入右端项b,各元素间以空格间隔:\n");  
    for(i=1;i<=size;i++)  
    {  
        scanf("%lf",&b[i-1]);  
    }  
      
      
    //在屏幕中输出用户输入的系数矩阵A和矩阵B  
    printf("\n亲爱的,您输入的维度是%d!\n您输入的矩阵A[][]:\n\n",NUM);    //在屏幕中输出用户输入的矩阵A  
    for(i=0;i<size;i++)  
    {  
        for(j=0;j<size;j++)  
            printf("%f\t",A[i][j]);  
        printf("\n\n");  
    }  
    printf("\n您输入的矩阵b[]:\n\n");  
    for(i=0;i<size;i++)  
        printf("\t%f\t\n\n",b[i]);  
    printf("\n\v");//打印矩阵b[]  
  
      
    //以下代码是高斯消去法的主要步骤  
    for(k=0;k<size-1;k++)  
    {  
        if(!A[k][k])  
            return -1;  
        for(i=k+1;i<size;i++)  
        {  
            Aik=A[i][k]/A[k][k];  
            for(j=k;j<size;j++)  
            {  
                A[i][j]=A[i][j]-Aik*A[k][j];  
            }  
            b[i]=b[i]-Aik*b[k];  
        }  
    }//首先通过正消过程,参见书本137页  
    printf("A[]\n");  
    for(i=0;i<size;i++)  
    {  
        for(j=0;j<size;j++)  
            printf("%f\t",A[i][j]);  
        printf("\n\n");  
    }  
    printf("\nb[]\n");  
    for(i=0;i<size;i++)  
        printf("\t%f\t\n\n",b[i]);  
    printf("\n\n"); //此处返回正消过程的结果  
    X[size-1]=b[size-1]/A[size-1][size-1];  
    for(k=size-2;k>=0;k--)  
    {  
        S=b[k];  
        for(j=k+1;j<size;j++)  
        {  
            S=S-A[k][j]*X[j];  
        }  
        X[k]=S/A[k][k];  
    }    //回代  
      
    //此处打印出向量X  
    printf("The solution x[]=\n\n");  
    for(i=0;i<size;i++)  
        printf("\t%f\t\n\n",X[i]);  
    return 0;  
}

from   网页链接

追问第一,这不是二元域的求解
第二,无解和无限解情况没给出啊

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
沙尘暴属于自然灾害吗 星配什么字好听男孩 女孩带星字叫什么名字好听又洋气 带星字优美人名 星字如何取名 带星字的名活泼的 非常潮流的星字名 成华区社保局地址 有什么平价又好用的防晒霜值得安利? 有哪些性价比比较高的物理防晒霜可以安利? 10000元放在银行卡有利息吗? 手环形号CMIlTID:2019DPI478的充电器? cmiltID2014cj9409的苹果手机型号是多少 联想a850和k30-t是什么时候生产的 韩湘子HT-K30什么时候发售 高铁商务座是什么咖啡 请问WIN7自带的图片编辑器在编辑图片时 怎么让选项工具栏长期显示... 关于进项税和销项税 携程网机票怎么退票 在携程网买的机票怎么退票 在一个是多久能退? 电信怎么充值2元话费? 91熊猫看书能阅读PDF格式吗?我的是诺基亚5800,一直想看PDF格式的,但是... 什么熊猫PDF、蝴蝶PDF到底是哪个软件自带的,每次鞋子都自动安装,天天打... ipod touch 熊猫看书 能看pdf文件吗 HTC G3 我下载了熊猫看书,能看pdf格式的电子书吗? 我的微信怎么才能使好友不知道我是谁,别人拉黑我的不在他的黑名单里 加微信又不想让她知道我是谁 携程网机票预订打折的力度大不大的啊 携程网打折机票电话是什么 携程网打折机票查询重庆一北京 用c语言编写一个程序用高斯消元法求解线性方程组的解程序流程图_百度知 ... 春运乘火车需注意哪些违禁品? 关于困难的名言警句和诗句 微信投票显示参数错误? ...有一个熊猫图标的软件可以编小游戏的软件叫什么之前好像是只小猫的... 熊猫头像病毒 应用软件变成了熊猫头像了??? 电脑桌面下面有一个熊猫上香图标是怎么回事 刚加的女生微信怎么聊天 怎样洗菜才干净呢? 中国怎么愚弄世界的 如何看待BBC纪录片《中国如何愚弄世界》 BBC 的纪录片《中国如何愚弄世界》观点够客观吗 是中国愚弄世界 还是西方舆论愚弄自己 携程网打折机票预订 $# oppo呼叫转移在哪里设置 求p图大神的QQ,会付钱的 我要一个ps老师的 谁知道可以p图的。比如这张图片一样。 造成青少年网瘾的根本原因是什么