matlab如何快速运行此代码?

时间:2012-06-08 13:00:39

标签: matlab matrix

我在matlab中有这段代码

b = 0.25*ones(4)
a = [0 1 1 1 ; 1/3 0 0 0 ; 1/3 0 0 0; 1/3 0 0 0] 

m = .85*a + .15*b

v = [1/4 1/4 1/4 1/4]

m^1e308*v'
  1. matlab如何快速运行m^1e308*v'?它应该多了 矩阵1e300次,但它可能做一些其他的计算, 它是什么?
  2. 为什么m^1e309*v'给出:

    ans =

       NaN
       NaN
       NaN
       NaN
    
  3. 如何在不使用符号变量的情况下查看m^inf是什么?

5 个答案:

答案 0 :(得分:8)

  

matlab如何快速运行m^1e308*v'

我无法告诉你Matlab的内部结构在做什么,但请注意,一般情况下,A^n可以在O(log n)时间内完成,而不是O(n)时间。

例如,A^16 = (((A^2)^2)^2)^2

您还可以使用特征分解将其转换为标量幂,即如果A = U*V*U',则幂为U * V^N * U',其中V是对角矩阵。

  

为什么m^1e309*v'会给NaN

双精度不能代表1e309

  

如何在不使用符号变量的情况下查看m^inf是什么?

使用上述特征分解。如果任何特征值小于1,它们将变为0,如果它们中的任何一个大于1,它们将变为无穷大。

答案 1 :(得分:2)

MATLAB非常快,因为它使用Basic Linear Algebra Subprograms (BLAS) Library。优化级别直至CPU级别,AMD和英特尔为其架构编写优化库。

BLAS用于构建MATLAB(MATrix LABoratory)的基础,因为BLAS用于构建Linear Algebra Package (LAPACK)。 LAPACK在MATLAB中提供所有低级矩阵命令(例如转置'm = .85*a + .15*b中的矩阵乘法)。它是用FORTRAN编写的,是开源的,所以大多数人不知道的是,MATLAB可以说是为您提供便利和GUI。

答案 2 :(得分:2)

正如其他人所解释的那样,diagonalization可以用来有效地计算矩阵的幂。亲自尝试一下:

[V,D] = eig(M);             %# M = V*D*inv(V)
V*(D.^realmax)/V            %# M^n = V*D^n*inv(V)

并与之比较:

M^realmax                   %# same as: mpower(M,realmax)

编辑:

以下是MathWorks自己的answer字样:

  

^

     

矩阵电源。如果X^p是标量,则X p为幂p p。如果X是   整数,通过重复平方计算功率。如果整数是   否定,p首先被反转。对于[V,D] = eig(X)的其他值,计算   涉及特征值和特征向量,如果X^p = V*D.^p/V,   然后x

     

如果P是标量且x^P是矩阵,xP提升到矩阵   使用特征值和特征向量的幂X^PXP和{{1}}   两个矩阵都是错误的。

答案 3 :(得分:1)

解决方案是否收敛? 在一个指数n之后,它可能只能看到m ^ n * m = m ^ n,因此m ^ 1e30000 = m ^ n

它甚至可以使用启发式算法,因为已知这些概率矩阵(每列中的总和= 1; 0到1之间的每个值)会聚在无限远处。

答案 4 :(得分:0)

我不知道matlab的内部结构,但是对角线化可能是解决方案(也可能是内部计算并行吗?)

查看本章:Applications of diagonalisation了解详情