首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

快速矩阵快速

前言 新年第一篇技术类文章,应该算是算法方面的文章。看标题:快速矩阵快速,好像挺高大上。其实并不是很难,快速就是快速求一个数(一个数 n 次方)。...理解了上面的几点,相信快速就难不到你了。下面来看看矩阵快速矩阵快速 其实矩阵快速思想是快速一样矩阵快速是用于快速求出一个矩阵 n 次方方法。...矩阵相乘结果也是一个矩阵,具体规则为:如果矩阵 A 列数等于矩阵 B 行数,假设矩阵 C = A*B, 那么矩阵行数矩阵 A 行数相等,矩阵 C 列数矩阵 B 相等。...看代码不难理解利用矩阵快速求方阵时间复杂度为O(m^3*logn),m为方阵行数列数(方阵相乘复杂度为 O(m^3),快速复杂度为 O(logn) )。...这两种方法都可以求解,但是可以有更高效方法,就是利用矩阵快速。 不过咋一看这怎么矩阵快速联系到一起呢?

2.5K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    疯子算法总结(五) 矩阵乘法 (矩阵快速

    学过线性代数都知道矩阵乘法,矩阵乘法条件第为一个矩阵行数等与第二个矩阵列数,乘法为第一个矩阵第一行乘以第二个矩阵第一列对应元素作为结果矩阵第一行第一列元素。...我们参考快速,将数字乘法换成矩阵乘法,可以得出矩阵快速代码; #include using namespace std; const int MOD=1e8+5;...{ if(k &1) ans =muti(ans,a,mod); a = muti(a,a,mod); k >>=1; } return ans; } 应用:矩阵快速求斐波那契数列...我们定义一个矩阵A |0 1| |1 1| 定义F(0)=0,F(1)=1。 构成矩阵F矩阵|0 1| A矩阵N次,乘以F矩阵第一项就是第N个斐波那契数列。...证明: F矩阵乘以A矩阵代表将右侧元素给左侧,右侧元素等于右侧加左侧。矩阵乘法满足结合律,所以FXX*……N……X = F (XXX……*X) 所以定义不同F矩阵可以得到不同斐波那契数列。

    67240

    客户端基本不用算法系列:矩阵快速

    回顾 在上一篇文章中,我们对快速算法进行了如下分析: int qpow(int x, int n, int m) { int res = 1; while (n) {...cout << qpow(10, 3, 997) << endl; // 3 cout << qpow(10, 2, 997) << endl; // 100 return 0; } 我们快速算法其实并没有真正优化乘法效率...我们换一个角度来想,如果有这么一种东西,它也支持乘法运算,同样也拥有像数乘法一样规律,是不是也可以进行快速优化? 斐波那契,万物之源 看到这个小标题是不是一脸蒙圈?...既然我们已经对矩阵 matrix 结构体做了乘法符号重载,那么我们快速算法实现直接对类型做修改即可: matrix qpow(matrix x, int n) { matrix res...在对左边零一矩阵做 n - 1 运算,乘以 base 矩阵,返回结果矩阵 res[0][0] 就是我们要求 Fib[n]。

    91910

    挑战程序竞赛系列(30):3.4矩阵

    https://blog.csdn.net/u014688145/article/details/76310181 挑战程序竞赛系列(30):3.4矩阵 详细代码可以fork下Github...练习题如下: POJ 3734: Blocks POJ 3420: Quad Tiling POJ 3735: Training Little cats POJ 3734: Blocks 矩阵入门题...状态转移方程: a = 2a + b; b = 2a + 2b + 2c; c = 2c + b; 矩阵技术在于把上述转移状态写成矩阵形式,因为每个状态只前几个状态相关而不是所有状态,这点很关键,...pmatrix}^i \begin{pmatrix} a_0 \\ b_0 \\ c_0 \\ \end{pmatrix} 当然可以思考下为什么矩阵时间复杂度为...0 1 0 1 0 b = 1 0 0 0 * 0 c 0 0 0 0 0 1 0 0 0 1 1 得 c = 0 每个操作可以单独初始向量相乘,保证矩阵相乘正确性,最后构造最先乘

    39640

    算法系列-----矩阵(二)-------------单位矩阵加法减法

    矩阵加法减法很简单,唯一要求就是:行列相等 首先我们看一维相加(其实就是数组相加): /** * 两个一维数组相加 * * @param args *...(矩阵a与b) */ public static double[][] plus(double[][] a, double[][] b) { int hang = a.length;...-3.0 -1.0 最基本操作:加减 还是要说。...很简单 只是想说明一点:我看过很多网上代码,有的人在加法减法中把结果直接存在 第一个参数中返回,这让我很是犹豫,我常常会想到交换函数时并没有改变他们值 或者是当同一个参数同时调用两个矩阵方法时...,发现了ab都变了,让我很是气恼 故而我觉得还是在代码中再定义一个局部变量比较好,尽管这样代码不够优化,但是我看很清楚。

    67220

    算法系列-----矩阵(三)-------------矩阵矩阵

    矩阵矩阵 注意矩阵下标是从 0开始到n-1m-1 获取某一列矩阵: /** * 矩阵矩阵函数 * * @param args *...参数a是个浮点型(double)二维数组,n是去掉列号 * @return 返回值是一个浮点型二维数组(矩阵去掉第n列后矩阵) */ public static double[][] zjz...获取去掉某一行某一行矩阵: /** * 矩阵矩阵函数 * * @param args *...参数a是个浮点型(double)二维数组,m是要去掉行号,n是去掉列号 * @return 返回值是一个浮点型二维数组(矩阵去掉第m行n列后矩阵) */ public static...----- 3.0 2.0 4.0 矩阵矩阵 -------------------------------- 1.0 3.0 矩阵矩阵 -------------------------

    1.1K50

    矩阵乘法Strassen算法+动态规划算法矩阵链相乘硬币问题)

    矩阵乘法Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效提高算法效率。...先分析一下下边 将一个矩阵分成四块 如上图,AB矩阵都被分成了四块,该算法复杂度依然是n3,于是上边那位老哥不服,他觉得这不是最优解,还有更优,于是他分析了上边是四个等式,四个等式中有八个乘法...ABCDEFGH原来两个相乘矩阵里边划分好八个小矩阵 图三 或者看这个图,总之七个矩阵变量是要求(PPT上这差不多,只是变量顺序换了) 图四 求出则七个矩阵,就能求出A*B值 这个图就是...如对于上边图六那个公式,a=7,k=2,b=2  显然7>2^2,所以套第三个T(n) 动态规划算法 动态规划分治法相似,都是通过组合字问题来求解原问题,不同之处在于分治法子问题互不干涉、互不交叉...,也就是其标量乘法次数之和最少(这块最好参照一下算法导论211页很详细),说白了,就是在乘法式子中如何打括号 官方的话就不说了,直接上一串矩阵,你应该干什么怎么干,哈哈,怎么干 图中给出了6个矩阵相乘

    3.9K60

    算法训练 2表示

    问题描述   任何一个正整数都可以用2进制表示,例如:1372进制表示为10001001。   ...将这种2进制表示写成2形式,令次排在前面,可得到如下表达式:137=2^7+2^3+2^0   现在约定次用括号来表示,即a^b表示为a(b)   此时,137可表示为:2(...最后可表示为:   2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 输入格式   正整数(1<=n<=20000) 输出格式   符合约定n...0,2表示(在表示中不能有空格) 样例输入 137 样例输出 2(2(2)+2+2(0))+2(2+2(0))+2(0) 样例输入 1315 样例输出 2(2(2+2(...0)))+2(2(2)+2(0))+2+2(0) 提示   用递归实现会比较简单,可以一边递归一边输出 import java.util.Scanner; /* * 用数组保存二进制数中1位置

    47520

    算法系列-----矩阵(七)-------------矩阵除法

    计算矩阵除法,其实就是将被除矩阵先转化为它矩阵,它矩阵相当于被除矩阵分之一, 那么矩阵除法就相当于前面的矩阵后面的矩阵矩阵相乘乘积。...百度经验:http://jingyan.baidu.com/article/d45ad14897fece69542b8077.html 接下来就是代码实现过程: /** * 矩阵除法函数...* * @param args * 参数a,b是两个浮点型(double)二维数组, * @return 返回值是一个浮点型二维数组(矩阵a除以b结果) */...multi(double[][],double[][])矩阵求逆inv(double[][])请参考前面的代码 测试矩阵: a------------------------------- 1.0...: /** * 矩阵除数函数 * * @param args * 参数a,是个浮点型(double)二维数组,b是浮点数 * @return 返回值是一个浮点型二维数组

    1.1K20

    迭代法求矩阵特征值Fortran程序

    昨天所发布迭代法称为正迭代法,用于求矩阵主特征值,也就是指矩阵所有特征值中最大一个。其算法如下: 满足精度要求后停止迭代,xj是特征向量,λj是特征值。...后记 正迭代法,用于求矩阵主特征值,也就是指矩阵所有特征值中最大一个。有正迭代法就有逆迭代法,逆迭代法可以求矩阵最小特征值以及对应特征向量。...迭代法是子空间迭代,Lancos迭代等方法求结构自振频率基础。 稍后会推出逆迭代法,敬请关注。 对于计算特征值,没有直接方法。2阶或3阶矩阵可以采用特征多项式来求。...当这些步骤提供了求特征向量方法后,如何求近似特征值?换句话说,假设矩阵A近似特征向量已经知道,如何求相应近似特征值?考虑特征方程 xξ = Ax 这里x是近似特征向量,ξ是特征值,且ξ未知。...借助于最小二乘,得到: 以上求特征值方法叫迭代法。

    3.9K51

    算法系列-----矩阵(五)-------------矩阵求逆

    首先要明确一点:非方阵不能求逆 也就是 n == m需要去判断,a.length == a[0].length 为了更好看清代码,我们先看下数学过程: /** * 矩阵求逆 *...* @param args * 参数a是个浮点型(double)二维数组, * @return 返回值是一个浮点型二维数组(矩阵a矩阵) */ public...; y < n * 2; y++) { result[x][y - n] = matrix1[x][y]; } } return result; } 现在我们先来跟踪代码输出四个主...for循环结果分别是什么: -------------------------------- 1.0 2.00.0 0.0 3.0 4.00.0 0.0 --------------------...编代码就非常清楚了 接下来我们再看看:过程处理是怎么样一个过程: -------------------------------- 1.02.01.00.0 0.0-2.0-3.01.0 --

    89620

    推荐算法——基于矩阵分解推荐算法

    一、推荐算法概述 对于推荐系统(Recommend System, RS),从广义上理解为:为用户(User)推荐相关商品(Items)。...常用推荐算法主要有: 基于内容推荐(Content-Based Recommendation) 协同过滤推荐(Collaborative Filtering Recommendation) 基于关联规则推荐...image.png 二、基于矩阵分解推荐算法 2.1、矩阵分解一般形式 image.png 2.2、利用矩阵分解进行预测 image.png 2.2.1、损失函数 image.png 2.2.2、损失函数求解...image.png 2.2.3、加入正则项损失函数即求解方法 image.png 2.2.4、预测 image.png 2.3、程序实现 对于上述评分矩阵,通过矩阵分解方法对其未打分项进行预测,...mat(ones((10,5))) ''' result = p * q #print p #print q print result 其中,利用梯度下降法进行矩阵分解过程中收敛曲线如下所示

    1.9K110
    领券