我在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'
m^1e308*v'
?它应该多了
矩阵1e300
次,但它可能做一些其他的计算,
它是什么?为什么m^1e309*v'
给出:
ans =
NaN
NaN
NaN
NaN
如何在不使用符号变量的情况下查看m^inf
是什么?
答案 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
是矩阵,x
将P
提升到矩阵 使用特征值和特征向量的幂X^P
。X
,P
和{{1}} 两个矩阵都是错误的。
答案 3 :(得分:1)
解决方案是否收敛? 在一个指数n之后,它可能只能看到m ^ n * m = m ^ n,因此m ^ 1e30000 = m ^ n
它甚至可以使用启发式算法,因为已知这些概率矩阵(每列中的总和= 1; 0到1之间的每个值)会聚在无限远处。
答案 4 :(得分:0)
我不知道matlab的内部结构,但是对角线化可能是解决方案(也可能是内部计算并行吗?)
查看本章:Applications of diagonalisation了解详情