精华内容
下载资源
问答
  • 此程序用指针实现任意矩阵的转置的子函数,先动态的开辟一段内存空间用以存放转置后的矩阵
  • 现要求输入一个255以内的整数(不要求判断输入的整数),表示杨辉三角形的阶数,格式为%d。输出对应阶数的杨辉三角形,输出格式为%5d,结果参照图1-图5。 提示可以定义容量为255*255的二维数组,然后根据输入的要求...

    二项式乘方展开式的系数存在着一定的规律。约1050年,我国北宋时期的贾宪在其著的《释锁算术》中,使用"贾宪三角"进行高次开方运算的研究。在1261年,我国南宋时期著名数学家杨辉在其著的《详解九章算法》中,引用了使用贾宪的结果,并绘画了"古法七乘方图"来表示二项式乘方展开式的系数,即目前常说的"杨辉三角形"。

    杨辉三角形存在特殊的规律,可以用二维数组来进行描述:

    (1)第一列的数都是1,a[i][0]=1;

    (2)对角线上的个数都是1, a[i][i]=1;

    (3)从第三行开始,满足关系a[i][j]=a[i-1][j-1]+a[i-1][j];

    现要求输入一个255以内的整数(不要求判断输入的整数),表示杨辉三角形的阶数,格式为%d。输出对应阶数的杨辉三角形,输出格式为%5d,结果参照图1-图5。

    提示可以定义容量为255*255的二维数组,然后根据输入的要求进行计算和输出。

    #include<stdio.h>
    int main()
    {
        int a[255][255],i,j,num;
        scanf("%d",&num);
        for(i=0;i<100;i++)                                  
        {
            for(j=0;j<100;j++)
                a[i][j]=0;
        }
        for(i=0;i<num;i++)                                  
            a[i][0]=1;
        for(i=1;i<num;i++)                                  
            for(j=1;j<=i;j++)
                a[i][j]=a[i-1][j]+a[i-1][j-1];
        for(i=0;i<num;i++)                                  
        {
            for(j=0;j<=i;j++)
                printf("%5d",a[i][j]);
            printf("\n");
        }
        return 0;
    }
    
    展开全文
  • 在一些需要用单片机、DSP、ARM等系统中用C语言实现高维滤波器的场合,例如卡尔曼滤波器,我们会经常遇到用C语言求解方阵的逆的情况,当阶数为2阶或者3阶的时候我们可以用公式法直接求解,但是当阶数一旦达到4阶或者4...

           在一些需要用单片机、DSP、ARM等系统中用C语言实现高维滤波器的场合,例如卡尔曼滤波器,我们会经常遇到用C语言求解方阵的逆的情况,当阶数为2阶或者3阶的时候我们可以用公式法直接求解,但是当阶数一旦达到4阶或者4阶以上时利用公式求解将会非常的麻烦,而且极易出错,这时我们需要寻求一种可以求解任意阶数的算法。由线性代数的知识可以知道求任意阶数矩阵逆矩阵有2种算法,一种是初等行(列)变换,一种是伴随矩阵法。其中初等行(列)变换由于需要进行行(列)的加减或交换,以及乘上(除以)非零的数这3种步骤,且顺序不固定,因此不适合用C程序进行实现。而伴随矩阵的方法求解步骤固定因此适合用C程序实现。

    算法描述

           根据线性代数的知识,我们可以知道对于N阶方阵A=\begin{bmatrix} a_{11} &a_{12} &... &a_{1N} \\ a_{21}&a_{22} &... &a_{2N} \\ ...&... &... &... \\ a_{N1}&a_{N2} &... &a_{NN} \end{bmatrix},它的伴随矩阵为A^{*}=\begin{bmatrix} A_{11} &A_{21} &... &A_{N1} \\ A_{12}&A_{22} &... &A_{N2} \\ ...&... &... &... \\ A_{1N}&A_{2N} &... &A_{NN} \end{bmatrix},其中A_{ij}=(-1)^{i+j}M_{ij}称为元素a_{ij}的代数余子式。则A的逆矩阵为A^{-1}=A^{*}/\left | A \right |,其中\left | A \right |为矩阵A的行列式。

    C语言实现代码

    /***************************************************************************************
     * 函数名称:Matrix_inv
     * 输入参数:x输入的NxN矩阵、y输出的NxN矩阵、N矩阵的阶数
     * 输出参数:1:表示输入矩阵有逆、0:表示输入矩阵的逆不存在
     * 实现功能:通过求伴随矩阵的方法求NxN矩阵的逆
     * 注意事项:需要的动态内存空间最少为:(2*2 + 3*3 + 4*4 + ... + (N-1)*(N-1))*4 = ((N-1)N(2N-1)/6 - 1)*4
     ****************************************************************************************/
    int Matrix_inv(float *x, float *y, int N)
    {
    	float det_x;
    	float recip_det_x;
    	float coff;
    	float *sub_x;
    	int i, j, k, sub_N;
    
    	det_x = Matrix_det(x, N);   //求行列式的值
    	if(det_x == 0)
    	{
    		return 0;     //表示矩阵的逆不存在
    	}
    	else
    	{
    		recip_det_x = 1/det_x;
    		coff = 1;
    		sub_N = N-1;
    		sub_x = (float *)malloc(4*sub_N*sub_N);   //初始值随机,动态分配N-1阶的数组
    		for(i=0; i<N; i++)
    		{
    			for(j=0; j<N; j++)
    			{
    				for(k = 0; k< sub_N; k++)    //提取去除第i行,第j列的数组
    				{
    					if(i<=k)
    					{
    						if(j == 0)                      { memcpy((void *)(&sub_x[k*sub_N]),    (void *)(&x[(k+1)*N+1]),      4*sub_N); }            //第0列时
    						else if(j == sub_N) { memcpy((void *)(&sub_x[k*sub_N]),    (void *)(&x[(k+1)*N]),            4*sub_N); }            //最后第N-1列时
    						else                                {  memcpy((void *)(&sub_x[k*sub_N]),    (void *)(&x[(k+1)*N]),            4*j);
    															         memcpy((void *)(&sub_x[k*sub_N+j]),(void *)(&x[(k+1)*N+j+1]), 4*(sub_N-j)); }
    					}
    					else
    					{
    						if(j == 0)                      { memcpy((void *)(&sub_x[k*sub_N]),    (void *)(&x[(k)*N+1]),      4*sub_N); }            //第0列时
    						else if(j == sub_N) { memcpy((void *)(&sub_x[k*sub_N]),    (void *)(&x[(k)*N]),            4*sub_N); }            //最后第N-1列时
    						else                                {  memcpy((void *)(&sub_x[k*sub_N]),    (void *)(&x[(k)*N]),            4*j);
    															         memcpy((void *)(&sub_x[k*sub_N+j]),(void *)(&x[(k)*N+j+1]), 4*(sub_N-j)); }
    					}
    				}
    				y[j*N+i] = coff*Matrix_det(sub_x, sub_N)*recip_det_x;     //第i行j列的代数余子式,并除上行列式的值
    				coff = -coff;
    			}
    		}
    		free((void *)sub_x);      //使用完后释放内存
    	}
    
    	return 1;     //表示矩阵的逆存在
    }

           从上述代码里我们可以看到,程序的实现步骤主要是:1、首先利用函数Matrix_det(关于行列式的C语言实现请参考博客任意阶数实数方阵的行列式的值的C语言实现详解。里面有关于矩阵行列式求解的具体C语言实现过程。)计算矩阵A的行列式,2、然后判断行列式的值是否为0,若为0则返回0表示矩阵的逆不存在。3、若非零,则逐个求解各元素的代数余子式并除以A的行列式,一共3大步骤。在实现的过程中,使用到了malloc(包含在头文件 <stdlib.h>中)函数动态分配内存,一共4*(N-1)*(N-1)个字节,用于存储N-1阶余子式的各元素,在Matrix_det中也使用了malloc函数进行内存分配,其中首次Matrix_det用求解A的行列式的时候占用的内存大小为((N-1)N(2N-1)/6-1)\times 4,但是用完后会被释放掉,与后面的不存在同时使用的情况。因此只需要考虑后面的Matrix_det使用的字节数量,它的大小为((N-2)(N-1)(2N-3)/6-1)\times 4再加上与它同时使用用于存储N-1阶余子式元素的4*(N-1)*(N-1)个字节一共还是((N-1)N(2N-1)/6-1)\times 4个字节,因此执行此函数需要的总的内存空间最低为((N-1)N(2N-1)/6-1)\times 4。而这些内存都是使用的堆(heap)空间,因此要保证系统的稳定运行heap的大小不能低于该值。程序中使用了memcpy(包含在头文件 <string.h>中)函数进行数据搬移,主要是为了提高程序执行效率,它的效率比直接的单个数的赋值要高。

     

     

     

    展开全文
  • C语言行列式计算
  • C语言学习笔记——循环嵌套——输出任意阶数空心菱形 输出效果 L1 000* L2 00*0* L3 0*000* L4 *00000* L5 0*000* L6 00*0* L7 000* 图形分析: 1.

    C语言学习笔记——循环嵌套——输出任意阶数空心菱形

    以4阶空心菱形为例,输出效果如下:

    L1  000*
    L2  00*0*
    L3  0*000*
    L4  *00000*
    L5  0*000*
    L6  00*0*
    L7  000*
    空格由0代替
    

    1.图形分析:

    前三行与后三行镜像,前置空格3,2,1递减,中间空格1,3,5递增。

    2.循环分析:

    L1  123*    x=0 y=1to3 z=0   
    L2  12*1*   x=1 y=1to2 z=1
    L3  1*123*  x=2 y=1    z=3
    L4  *12345* x=3 y=0    z=5
    

    x控制换行,y控制前置空格,z控制中间空格。
    通过增加判断条件,输出*。

    3.代码

    #define JS 4  //定义阶数
    #include<stdio.h>
    void main()
    {
        int x,y,z;
        for(x=0;x<=JS-1;x++)//x=0to3换行4次
            {
                for(y=x;y<=JS-2;y++)//x=0,y=0to2,输出3次;x=1,y=0to1,输出2次;x=2,y=2,输出1次;x=3,y不输出
                    {
                        printf(" ");            
                    } 
                printf("*");       
                for(z=2*x-1;z>=1;z--)//x=0,z=-1,不输出;x=1,z=1,输出1次;x=2,z=3,输出3次;x=3,z=5,输出5次
                    {
                        printf(" "); 
                    }
                if(x>0{
                        printf("*");    
                    }    
                if(x<JS-1)
                    {
                        printf("\n"); 
                    }
                  
            }
            printf("\n");
    //反向输出
           for(x=JS-2;x>=0;x--)//x=0to2,换行3次
            {
                for(y=x;y<=JS-2;y++)
                    {
                        printf(" ");            
                    } 
                printf("*");       
                for(z=2*x-1;z>=1;z--)
                    {
                        printf(" "); 
                    }
                if(x>0)
                    {
                        printf("*");    
                    }    
                if(x<JS)
                    {
                        printf("\n"); 
                    }
                  
            }
             
        system("pause");
    }    
       
    
    展开全文
  • 求任意阶数矩阵的行列式——C语言

    千次阅读 2019-02-27 22:22:10
    printf("输入行列式的阶数:"); scanf("%d", &n); a = (double*)malloc(sizeof(double) * n * n); if(a==NULL){ printf("没有可用内存!\n"); exit(0); } printf("输入%d个数;",n*n ); for (i = 0; i ; i++) ...
    /**
     * [description]  求n阶矩阵的行列式
     * @Author   fan_zhang
     * @DateTime 2019-02-27T22:12:58
     */
    #include <stdio.h>
    #include <stdlib.h>
    double det(double* , int );
    int main(int argc, char const* argv[])
    {
        int i, j, n ;
        double* a;
        printf("输入行列式的阶数:");
        scanf("%d", &n);
        a = (double*)malloc(sizeof(double) * n * n);
        if(a==NULL){
            printf("没有可用内存!\n");
            exit(0);
        }
        printf("输入%d个数;",n*n );
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                scanf("%lf", a + i * n + j);
        printf("detA=%g\n", det(a, n));
        free(a);
        return 0;
    }
    double det(double* a, int N)//数组a[N][N]
    {
        int i, j, m, n, s, t, k = 1;
        double f = 1.0, c, x;
        for (i = 0, j = 0; i < N && j < N; i++, j++) {
            if (a[i * N + j] == 0) {//a[i][j]检查主对角线是否为0
                for (m = i + 1; m < N && a[m * N + j] == 0; m++)//a[m][j]
                    ;
                if (m == N)//全为0则行列式为0
                    return 0;
                else
                    for (n = j; n < N; n++) {//交换两行
                        c = a[i * N + n];//a[i][n]
                        a[i * N + n] = a[m * N + n];//a[i][n]=a[m][n]
                        a[m * N + n] = c;//a[m][n]
                    }
                k = -k;
            }
            for (s = N - 1; s > i; s--) {//列变换成上三角行列式
                x = a[s * N + j];//a[s][j]
                for (t = j; t < N; t++)
                    a[s * N + t] -= a[i * N + t] * (x / a[i * N + j]);
            }
        }
        for (i = 0; i < N; i++)//a[i][i]
            f *= a[i * N + i];
        return k * f;
    }
    

    运行结果

    代码段 小部件
    [Dàimǎ duàn xiǎo bùjiàn]
    Snippet widget
     
    展开全文
  • 一、C语言编程实现任意阶Gold序列 1. 任意阶Gold序列的程序设计流程图: 2. 任意阶Gold序列源程序 【Gsquence.c】 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #incl...
  • 一、C语言编程实现任意阶m序列 1. 任意阶m序列的程序设计流程图: 2. 任意阶m序列源程序 【Msquence.c】 #include&amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;...
  • //n是拟合的阶数 m = 15; //m是初始数据的长度 arrycon(x, a, m, n); //a[][]是A arrytrans(a, b, m, n); //b[][]是A' arrymul(b, a, c, n, m, n); //c[][]是A'*A arrymuls(b, y, d, n, m); //d[][]是A'*y arryans...
  • 算法描述 对于一个N阶的方阵,则它的行列式的值为,这里我们引入余子式的概念,在线性代数的课本中它的定义如下:在N阶行列式中,把元素所在的第i行和第j列划去后,留下了的N-1阶行列...因此可以非常方便的用C语言...
  • 可以自由调整阶数(1到无穷),自由选择类型(BUTTERWORTH,OR CHEBSHV一型或二型)
  • 如果前一个数字为阶数的倍数,则后面一个数行数加一列数不变 /* 时间:2020/08/15 目的:输出魔方阵的奇魔方类型 功能:对于数组的一些操作 */ #include <stdio.h> #define N 5 int main() { int a[N]...
  • 思路: /* 时间:2020/08/15 目的:输出魔方阵之偶魔方(阶数为4的倍数) 功能:对于数组的一些操作 */ #include<stdio.h> #define N 4
  • 思路:将其分为4部分,按顺时针方向依次为A,B,C,D。A按照奇魔方的方式对其赋值 ... 目的:输出魔方方阵之偶魔方(阶数不为4的倍数) 功能:对于二维数组的一些操作 */ #include<stdio.h> #define N 10
  • C语言实现魔方源代码

    2012-10-20 19:27:58
    C语言实现任意阶数的魔方源代码。绝对正确,亲自编写
  • 写在开头:题源来自于凌云、吴海燕、谢满德老师们编著的《C语言程序设计与实践》。 编译器:Dev C++ 代码是根据自己的逻辑来实现的,部分题目的算法思想写在了程序代码的注释中。有些解法仅仅是能够实现最终结果,但...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 168
精华内容 67
关键字:

c语言阶数

c语言 订阅