matlab flipud poly函数 C实现

这里可以将这两个函数分别对double数组和complex数组实现

double_filepud

void double_filepud(double *m, int length)
{
    int i, j;
    double temp;

    for (i = 0; i < length / 2; i++)
    {
        // 交换当前元素和对应的对称元素
        temp = m[i];
        m[i] = m[length - 1 - i];
        m[length - 1 - i] = temp;
    }
}

由于filepud函数比较简单,就不罗列complex数组的filepud实现了

double_poly

void double_poly(double *p, int np, double *d)
{
    double *temp = (double *)malloc(sizeof(double) * np * np);

    for (size_t i = 0; i < np; i++)
    {
        for (size_t j = 0; j < np; j++)
        {
            temp[i * np + j] = p[i * np + j];
        }
    }

    // eig(A)
    double *u_real = (double *)malloc(sizeof(double) * np);
    double *v_imag = (double *)malloc(sizeof(double) * np);
    int jt = 60;
    hhbg(temp, np);
    hhqr(temp, np, EPS, jt, u_real, v_imag);

    Complex *dt = (Complex *)malloc(sizeof(Complex) * (np + 1));
    Complex *dtt = (Complex *)malloc(sizeof(Complex) * (np + 1));
    dt[0].real = 1;
    dt[0].imaginary = 0;
    for (size_t i = 1; i < np + 1; i++)
    {
        dt[i].real = 0;
        dt[i].imaginary = 0;
    }
    for (size_t i = 0; i < np; i++)
    {
        for (size_t j = 1; j <= i + 1; j++)
        {
            dtt[j] = complex_subtract(dt[j], complex_multiply(create(u_real[i], v_imag[i]), dt[j - 1]));
        }
        for (size_t j = 1; j <= i + 1; j++)
        {
            dt[j].real = dtt[j].real;
            dt[j].imaginary = dtt[j].imaginary;
        }
    }

    for (size_t i = 0; i < np + 1; i++)
    {
        d[i] = dt[i].real;
    }

    free(temp);
    free(u_real);
    free(v_imag);
    free(dt);
    free(dtt);
}

这个函数针对矩阵,先转换为上海森伯格矩阵,再使用QR法来求解

complex_poly

void complex_poly(Complex *p, int np, Complex *d)
{
    Complex *c = (Complex *)malloc((np + 1) * sizeof(Complex));
    c[0].real = 1.0;
    c[0].imaginary = 0.0;
    d[0] = c[0];
    for (int i = 1; i < np + 1; i++)
    {
        c[i].real = 0.0;
        c[i].imaginary = 0.0;
        d[i]=c[i];
    }

    Complex temp;
    for (int i = 0; i < np; i++)
    {
        for (int j = 1; j <= i + 1; j++)
        {
            temp = complex_multiply(p[i], d[j - 1]);
            c[j].real = d[j].real - temp.real;
            c[j].imaginary = d[j].imaginary - temp.imaginary;
        }
        for (int j = 1; j <= i + 1; j++)
        {
            d[j].real = c[j].real;
            d[j].imaginary = c[j].imaginary;
        }
    }
    free(c);
}

在matlab中向量也可以使用poly,这里再加上针对double向量的ploy函数实现

vector_poly

void vector_poly(double *p, int np, double *d)
{
    // 初始化多项式系数
    double *dt = (double *)malloc(sizeof(double) * (np + 1));
    double *dtt = (double *)malloc(sizeof(double) * (np + 1));
    for (int i = 0; i <= np; ++i) {
        dt[i] = 0.0;
    }
    dt[0] = 1.0;

   for (size_t i = 0; i < np; i++)
    {
        for (size_t j = 1; j <= i + 1; j++)
        {
            dtt[j] = dt[j]-p[i]*dt[j - 1];
        }
        for (size_t j = 1; j <= i + 1; j++)
        {
            dt[j] = dtt[j];
        }
    }

    for (size_t i = 0; i < np + 1; i++)
    {
        d[i] = dt[i];
    }
    
    free(dt);
    free(dtt);
}

测试

经过与matlab结果进行对比,基本无误,可以放心食用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值