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'与えるのですか:

    ans =

       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は、 Basic Linear Algebra Subprograms(BLAS)ライブラリを使用しているため、非常に高速です。最適化のレベルはCPUレベルまで下がり、AMDとIntelはアーキテクチャ用に最適化されたライブラリを作成します。

BLASは線形代数パッケージ(LAPACK)の構築に使用されたため、BLASはMATLAB(MATrix LABoratory)の基盤の構築に使用されます。LAPACKは、MATLABのすべての低レベル行列コマンド(の転置'や行列乗算などm = .85*a + .15*b)を提供します。これはFORTRANで書かれており、オープンソースであるため、ほとんどの人が知らないのは、MATLABが便利さと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^pがスカラーの場合、はX累乗です。が整数の場合、累乗は2乗を繰り返すことによって計算されます。整数が負の場合、最初に反転されます。のその他の値の場合、計算には固有値と固有ベクトルが含まれます。たとえば、の場合、。pppXp[V,D] = eig(X)X^p = V*D.^p/V

xがスカラーでP行列の場合、はx^P固有値と固有ベクトルを使用xして行列の累乗になります。、ここでとは両方の行列であり、はエラーです。PX^PXP

于 2012-06-08T13:38:24.657 に答える
1

ソリューションは収束しますか?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 に答える