矩阵快速幂学习入门


矩阵快速幂的原理是跟普通的快速幂一样,不过原来是数与数相乘,而矩阵快速幂是矩阵与矩阵相乘;

矩阵快速幂是运用于处理一些表达式进行多次递归会超时的问题;难点就是怎样构造矩阵,比如f[ n ] = f[n - 1] + f[ n - 2],

那么构造成的矩阵为:

1 1 

1 0;

模板:

typedef struct
{
    ll a[7][7];
    void Init()
    {
        memset(a,0,sizeof(0));
        for(int i = 1; i < 7; i ++)
        {
            a[i][i] = 1;
        }
    }
}Matrix;
Matrix p =
{
    1,2,1,4,6,4,1,
    1,0,0,0,0,0,0,
    0,0,1,4,6,4,1,
    0,0,0,1,3,3,1,
    0,0,0,0,1,2,1,
    0,0,0,0,0,1,1,
    0,0,0,0,0,0,1
};
Matrix Matrix_Mul(Matrix a,Matrix b)
{
    Matrix c;
    for(int i = 0; i < 7; i ++)
    {
        for(int j = 0; j < 7; j ++)
        {
            c.a[i][j] = 0;
            for(int k = 0; k < 7; k ++)
            {
                c.a[i][j] += (a.a[i][k] * b.a[k][j]) % MOD;
                c.a[i][j] %= MOD;
            }
        }
    }
    return c;
}
Matrix pow_Matrix(ll m)
{
    Matrix ans,b = p;
    memset(ans.a,0,sizeof(ans.a));
    for(int i = 0; i < 7; i ++)
    {
        ans.a[i][i] = 1;
    }
    while(m)
    {
        if(m & 1)
        {
            ans = Matrix_Mul(ans,b);
        }
        m >>= 1;
        b = Matrix_Mul(b,b);
    }
    return ans;
}


hdu2157


这是裸的矩阵快速幂,给出的图就是要进行相乘的矩阵,

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef long long ll;
const int maxn = 100 + 10;
#define mod 1000

struct Matrix
{
    ll a[maxn][maxn];
}origin,res;
void Init(ll n)
{

    memset(res.a,0,sizeof(res.a));
    for(ll i = 0; i < n ; i ++)
    {
        res.a[i][i] = 1;
    }
}
Matrix Matrix_multi(Matrix aa,Matrix bb,ll n)//两矩阵相乘的算法
{
    Matrix ress;
    memset(ress.a,0,sizeof(ress));
    for(ll i = 0; i < n ; i ++)
    {
        for(ll  j = 0; j < n ; j ++)
        {
            for(ll k = 0; k < n ; k ++)
            {
                ress.a[i][j] += aa.a[i][k] * bb.a[k][j];
            }
        }
    }
    return ress;
}
void Matrix_calc(ll n,ll k)//矩阵快速幂
{
    Matrix origins = origin;
    while(k)
    {
        if(k & 1)
        {
            res = Matrix_multi(res,origins,n);
        }
        origins = Matrix_multi(origins,origins,n);
        k >>= 1;
    }
}

int main()
{
    int n,m;
    while( ~ scanf("%d%d",&n,&m) && (n || m) )
    {
        Init(n);
        memset(origin.a,0,sizeof(origin.a));
        for(ll i = 1; i <= m ; i ++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            origin.a[x][y] = 1;
        }
        int q;
        scanf("%d",&q);
        for(ll i = 1; i <= q; i ++)
        {
            Init(n);
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            Matrix_calc(n,k);
            cout << res.a[x][y] % mod <<endl;
        }
    }
    return 0;
}

hdu5950   Recursive sequence


题意:f[ n ] = f[n - 1] + 2 * f[n - 2] + n * 4;  n的范围< 2^31;

思路:数据范围很大,

首先一看这个题目,很容易想到构造矩阵:那么我们现在来分析一下怎么构造这个矩阵,那么 (n+1)^4 = n^4+4n^3+6n^2+4^n+1 所以光 (n+1)^4 这个矩阵就能构造出 5∗5 的一个矩阵来, 然后 f(n) = f(n−1)+2∗f(n−2) 这个是 2∗2 的矩阵,所以构造出来就应该是 7∗7 的转移矩阵 A : 
{f(n),f(n−1),n^4,n^3,n^2,n,1}∗A={f(n+1),f(n),(n+1)^4,(n+1)^3,(n+1)^2,(n+1),1}
然后 f(n+1) = f(n)+2∗f(n−1)+(n+1)4, 可得矩阵 A: 

Matrix p =
{
    1,2,1,4,6,4,1,
    1,0,0,0,0,0,0,
    0,0,1,4,6,4,1,
    0,0,0,1,3,3,1,
    0,0,0,0,1,2,1,
    0,0,0,0,0,1,1,
    0,0,0,0,0,0,1
};

然后就是直接代码了:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MOD 2147493647
const int maxn = 200+ 20;
typedef struct
{
    ll a[7][7];
    void Init()
    {
        memset(a,0,sizeof(0));
        for(int i = 1; i < 7; i ++)
        {
            a[i][i] = 1;
        }
    }
}Matrix;
Matrix p =
{
    1,2,1,4,6,4,1,
    1,0,0,0,0,0,0,
    0,0,1,4,6,4,1,
    0,0,0,1,3,3,1,
    0,0,0,0,1,2,1,
    0,0,0,0,0,1,1,
    0,0,0,0,0,0,1
};
Matrix Matrix_Mul(Matrix a,Matrix b)
{
    Matrix c;
    for(int i = 0; i < 7; i ++)
    {
        for(int j = 0; j < 7; j ++)
        {
            c.a[i][j] = 0;
            for(int k = 0; k < 7; k ++)
            {
                c.a[i][j] += (a.a[i][k] * b.a[k][j]) % MOD;
                c.a[i][j] %= MOD;
            }
        }
    }
    return c;
}
Matrix pow_Matrix(ll m)
{
    Matrix ans,b = p;
    memset(ans.a,0,sizeof(ans.a));
    for(int i = 0; i < 7; i ++)
    {
        ans.a[i][i] = 1;
    }
    while(m)
    {
        if(m & 1)
        {
            ans = Matrix_Mul(ans,b);
        }
        m >>= 1;
        b = Matrix_Mul(b,b);
    }
    return ans;
}
int main()
{
    int Tcase;
    scanf("%d",&Tcase);
    for(int ii = 1; ii <= Tcase; ii ++)
    {
        ll n,a,b;
        scanf("%I64d%I64d%I64d",&n,&a,&b);
        if(n == 1)
        {
            cout << a << endl;
            continue;
        }
        if(n == 2)
        {
            cout << b << endl;
            continue;
        }
        Matrix ans = pow_Matrix(n - 2);
        ll anss = 0;
        anss = (anss +  ans.a[0][0] * b % MOD) % MOD;
        anss = (anss +  ans.a[0][1] * a % MOD) % MOD;
        anss = (anss +  ans.a[0][2] * 16 % MOD) % MOD;
        anss = (anss +  ans.a[0][3] * 8 % MOD) % MOD;
        anss = (anss +  ans.a[0][4] * 4 % MOD) % MOD;
        anss = (anss +  ans.a[0][5] * 2 % MOD) % MOD;
        anss = (anss +  ans.a[0][6] * 1 % MOD) % MOD;
        cout << anss << endl;
    }
    return 0;
}






内容概要:本文系统介绍了基于C#(VS2022+.NET Core)与HALCON 24.11的工业视觉测量拟合技术,涵盖边缘提取、几何拟合、精度优化及工业部署全流程。文中详细解析了亚像素边缘提取、Tukey抗噪算法、SVD平面拟合等核心技术,并提供了汽车零件孔径测量、PCB焊点共面性检测等典型应用场景的完整代码示例。通过GPU加速、EtherCAT同步等优化策略,实现了±0.01mm级测量精度,满足ISO 1101标准。此外,文章还探讨了深度学习、量子启发式算法等前沿技术的应用前景。 适合人群:具备一定编程基础,尤其是熟悉C#和HALCON的工程师或研究人员,以及从事工业视觉测量与自动化检测领域的技术人员。 使用场景及目标:①学习如何使用C#和HALCON实现高精度工业视觉测量系统的发;②掌握边缘提取、抗差拟合、3D点云处理等核心技术的具体实现方法;③了解工业部署中的关键技术,如GPU加速、EtherCAT同步控制、实时数据看板等;④探索基于深度学习和量子计算的前沿技术在工业视觉中的应用。 其他说明:本文不仅提供了详细的理论分析和技术实现,还附有完整的代码示例和实验数据,帮助读者更好地理解和实践。同时,文中提到的硬件选型、校准方法、精度验证等内容,为实际项目实施提供了重要参考。文章最后还给出了未来的技术演进方向和发者行动建议,如量子-经典混合计算、自监督学习等,以及参与HALCON官方认证和源社区的建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值