3

我在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'给出:

    答案=

       NaN
       NaN
       NaN
       NaN
    
  3. m^inf不使用符号变量如何查看内容?

4

5 回答 5

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,它们将变为无穷大。

于 2012-06-08T13:07:45.513 回答
2

MATLAB is so fast because it uses a Basic Linear Algebra Subprograms (BLAS) Library. The level of optimization goes right down to the CPU level, with AMD and Intel writing optimized libraries for their architectures.

BLAS is used to build the foundation of the MATLAB (MATrix LABoratory), as BLAS was used to build Linear Algebra Package (LAPACK). LAPACK provides all the low-level matrix commands in MATLAB (such as the transpose ' and matrix multiplication in m = .85*a + .15*b). It's written in FORTRAN and is open source, so what most people don't know is that MATLAB is arguably selling you convenience and a GUI.

于 2012-06-08T13:20:15.897 回答
2

正如其他人所解释的,对角化可用于有效计算矩阵的幂。自己试试:

[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 自己的话中的答案:

^

矩阵电源。X^pXp,如果p是标量。如果p是整数,则通过重复平方计算幂。如果整数为负数,X则先取反。对于 的其他值p,计算涉及特征值和特征向量,例如如果[V,D] = eig(X),则X^p = V*D.^p/V

Ifx是一个标量并且P是一个矩阵,使用特征值和特征向量将x^Px提升到矩阵幂PX^P,其中XP都是矩阵,是一个错误。

于 2012-06-08T13:38:24.657 回答
1

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

它甚至可以使用启发式算法,因为已知这些概率矩阵(每列中的总和 = 1 ;每个值在 0 和 1 之间)收敛于无穷大。

于 2012-06-08T13:05:55.983 回答
0

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

查看本章:对角化的应用了解详情

于 2012-06-08T13:12:27.093 回答