このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
このトピックでは,MATLAB®で行列を作成し,基本的な行列演算を行う方法を紹介します。
MATLAB環境では,“行”列という用語を使って,2次元グリッドに配置された実数または複素数を含む変数を示します。“配列“とは一般的に数値のベクトル,行列または高次元グリッドです。MATLABのすべての配列は四角形になり、すべての次元の成分は同じ長さになります。行列で定義される数学演算は、線形代数で取り扱う内容です。
MATLABには,さまざまな行列を作成する関数が多数用意されています。たとえば,パスカルの三角形に基づくエントリを含んだ対称行列を作成することができます。
一个=帕斯卡(3)
A = 1 1 1 1 2 3 1 3 6
または,行方向と列向和が等しい対称の“魔方陣行列“を作成することもできます。
B =魔法(3)
B = 8 1 6 3 5 7 4 9
もう1つの例は,ランダムな整数からなる3行2列の方形行列です。ここでは,兰迪
への最初の入力が整数値の取り得る範囲を示し,次の2つの入力が行と列の数を示します。
C =兰迪(10、3、2)
C = 9 10 10 7 2 1
列ベクトルはm行1列の行列,行ベクトルは1行n列の行列,スカラーは1行1列の行列です。行列を手動で定義するには,大かっこ[]
を使用して配列の先頭と末尾を示します。大かっこ内で行末を示すには,セミコロン;
スカラー(1行1列の行列のの合,大型はは列ベクトル,行,ベクトル,およびスカラーを生成しし。
u = [3;1;4 . v = [2 0 -1] s = 7
U = 3 1 4 v = 2 0 -1 s = 7
行列の作成と取り扱い方法の詳細は,行列の作成,連結,および拡張を参照してください。
行列と配列の加算および減算は要素ごとに,すなわち“要素単位“で実行されます。たとえば,一个
をB
に加算し,その結果から一个
を減算するとB
に戻ります。
X = a + b
x = 9 2 7 4 7 10 5 12 8
Y = x - a
Y = 8 1 6 3 5 7 4 9
加算と減算では,両方の行列の次元に互換性がなければなりません。次元に互換性がない場合はエラーになります。
X = a + c
误差使用+矩阵维度必须一致。
詳細については,配列と行列の演算を参照してください。
同じ長さの行ベクトルと列ベクトルの乗算は,順番を変えても計算結果は同じになります。結果は,“内”積と呼ばれるスカラーか,“外”積と呼ばれる行列のいずれかになります。
u = [3;1;4);V = [2 0 -1];x = v * u
x = 2
X = u * v
X = 6 0 -3 2 0 -1 8 0 -4
交货行为の“転置“演算では,ijと一霁を交換します。複素数行列の場合,もう1つの考慮事項は,配列内の複素数エントリの複素共役から”複素共役転置”を形成するかどうですか.matlabはアポストロフィ演算子('
)を使用して複素共役転置を行い,ドットアポストロフィ演算子(”。
)を使用して共役なしの転置を行います。すべての要素が実数の行列では、これら 2 つの演算子の処理は同じになります。
例の行一个=帕斯卡(3)
は“対称“であるため,一个“
は一个
と等しくなります。しかし,B =魔法(3)
は対称でないため,B”
の各要素は主対角に対し鏡像の位置になります。
B =魔法(3)
B = 8 1 6 3 5 7 4 9
X = B”
X = 8 3 4 1 5 9 6 7 2
ベクトルの場合,転置によって行ベクトルは列ベクトル(またはその逆)になります。
X = v' X = 0 -1
x
とy
が共に分数の列のの场合,积x * y
は定義されません。ただし,次の 2 つの積、
x'* y
と
y ' * x
は同じスカラーの結果を生成します。これらは使用頻度が高く,"内" 積、“スカラー”积,”“ドット積と呼ばれています。点
という名前の,ドット積専用の関数も用意されています。
複素数ベクトルや行列z
に対して,z”
は複素共役転置を表します。すなわち,各要素の虚数部の符号が逆になります。たとえば,次の複素行列を考えます。
Z = [1+2i 7-3i 3+4i;6-2i 9我4 + 7)
Z = 1.0000 + 2.0000i 7.0000 - 3.0000i 3.0000 + 4.0000i 6.0000 - 2.0000i 0.0000 + 9.0000i 4.0000 + 7.0000i
z
の複素共役転置は次のようになります。
z”
Ans = 1.0000 - 2.0000i 6.0000 + 2.0000i 7.0000 + 3.0000i 0.0000 - 9.0000i 3.0000 - 4.0000i 4.0000 - 7.0000i
各要素の虚数部がその符号を保持し,共役を取らない複素転置はz”。
で定義します。
z”。
Ans = 1.0000 + 2.0000i 6.0000 - 2.0000i 7.0000 - 3.0000i 0.0000 + 9.0000i 3.0000 + 4.0000i 4.0000 + 7.0000i
複素ベクトルに対して2つのスカラー積x'* y
とy ' * x
は互いに複素共役で,スカラー積x'* x
は実数です。
行列の乗算は,線形変換の構成を反映するように定義されており,線形方程式を簡潔に表現できます。行程積 C = AB は、A の列の次元が B の行の次元と等しいとき、またはどちらかがスカラーの場合に定義されます。A が m 行 p 列で、B が p 行n 列の行列の場合、積 C は m 行 n 列の行列になります。積は、実際には MATLAB の为
ループ,结肠
表記,ベクトルのドット積を使って定義できます。
一个=帕斯卡(3);B =魔法(3);m = 3;n = 3;为i = 1: m为j = 1:n c(i,j)= a(i,:) * b(:,j);结束结束
MATLABでは,C = A * B
のように,アスタリスクを使って行列の乗算を示します。行列の乗算は可換的ではありません。つまり,通常においてA * B
はB *
と等価ではありません。
X = A * B
X = 15 15 15 26 38 26 41 70 39
Y = B *
Y = 15 28 47 15 34 60 15 28 43
行列は,列ベクトルを右から,行ベクトルを左から乗算します。
u = [3;1;4);x = A *
X = 8 17 30
V = [2 0 -1];y = v * B
Y = 12 -7
方形行列の乗算では,次元を一致させる必要があります。一个
は3行3列で,C
は3行2列のため,両者を乗算して3行2列の結果が得られます(共通の内部次元が相殺されます)。
X = A * C
X = 24 17 47 42 79 77
ただし,乗算は逆の順序では実行できません。
Y = C *
使用*不正确的维度进行矩阵乘法时出错。检查第一个矩阵的列数与第二个矩阵的行数是否匹配。要执行元素乘法,请使用'.*'。
あらゆるものをスカラーで乗算できます。
s = 10;w = s * y
W = 120 -70 100
配列をスカラーで乗算する場合,スカラーは暗黙的にもう一方の入力と同じサイズに拡張されます。これはしばしば”“スカラー拡張と呼ばれます。
一般的な数学表記では,大文字の我で単位行列を表します。単位行列は対角要素が 1 で、他の要素が 0 である任意のサイズの行列です。この行列の次元が一致する場合、AI = A かつ IA = A になります。
MATLABの以前のバージョンでは大文字と小文字を区別して認識していなかったため,単位行列に我を使用できませんでした。これは我を既に添字や複素数単位として使用していたためです。そこで,英語の語呂合わせで関数名を作成しました。関数
眼睛(m, n)
はm行n列の方形の単位行列を返し,眼睛(n)
はn行n列の正方の単位行列を返します。
行程一个
が正方行列で特价ではない(非ゼロの行列式)综合,方程AX =我とXA =我は同じ解xをもちます。このこの解,一个
の“逆数”と呼ばれ,一个-1关としてれます。关节发票
と式^ 1
はは方とも逆行列を计算し。
一个=帕斯卡(3)
A = 1 1 1 1 2 3 1 3 6
X =发票(A)
X = 3.0000 -3.0000 1.0000 -3.0000 5.0000 -2.0000 1.0000 -2.0000 1.0000
* X
Ans = 1.0000 00 0.0000 1.0000 -0.0000 -0.0000 0.0000 1.0000
黛联
で計算される“行列式”は,行列で記述される線形変換のスケーリングファクターの尺度となります。行列式が正確にゼロの場合,行列は“特異行列“で逆行列は存在しません。
d =侦破(A)
d = 1
一部の行列は“近特异行”“で,逆行列が现出者,计算计算数码误差の影响受けます。关联气孔导度
は,逆行列から得られる結果の精度がわかる“逆行列計算の条件数”を計算します。条件数の範囲は,数値的に安定した行列の1
から特价行程の正
までです。
c =电导率(A)
c = 61.9839
行列の明示的な逆行列を求める必要はあまりありません。関数发票
は,線形方程式系斧= B.を解くときにしばしば誤用されます。実行時間と数値精度の両面でこの方程式を解く一番優れた方法は,行列バックスラッシュ演算子をx = A \ b
のように使用することです。詳細については,mldivide
を参照してください。
2つの行列の积kron(x,y)
は,X
とY
の要素のすべての組み合わせの積で作成される大規模な行列です。X
がm行n列,Y
がp行列の場合,kron(x,y)
は议员行nq列の行列になります。要素は,X
の各要素が行列Y
全源で乘算されるにささます。
[x (1,1)* y x (1,2)* y…X(1,n)*Y…X(m,1)*Y X(m,2)*Y…X (m, n) * Y]
クロネッカー積は0と1からなる行列を使って,繰り返し小さな行列のコピーを作成します。たとえばX
が2行2列の行列であるとき,
x = [1 2 3 4]
また,我眼睛= (2,2)
が2行2列の単位行列であるとき,
克隆亚麻(X,我)
Ans = 1 0 2 0 0 1 0 2 3 0 4 0 3 0 4
と
克隆亚麻(I (X)
Ans = 1 2 0 0 3 4 0 0 0 1 2 0 0 3 4
ベクトルxのpノルムノルムは次次のよう定义ささささささ
常态(x,p)
で計算されます。この演算は,p > 1を満たす任意の値に対して定義されますが,最も広く使われるpの値は1,2,および∞です。既定値はでp = 2,”“ユークリッド長や“ベクトルベクトル”に対応します。
V = [2 0 -1];(规范(v, 1)规范(v)规范(v,正)]
Ans = 3.0000 2.2361 2.000
行列のpノルム
はp = 1 2∞に対して规范(A, p)
でで计算されれはでも既定値はp = 2です。
一个=帕斯卡(3);(规范(1)规范(A)规范(A,正)]
Ans = 10.0000 7.8730 10.0000
行列の各行または各列のノルムを計算する場合は,vecnorm
を使用できます。
vecnorm (A)
Ans = 1.7321 3.7417 6.7823
MATLABは多数の线路幂关关数と要素ごと计算サポートしてます计算をサポートてますますを実さますます。关键やれます。关键词さます。关键词式に対しますささに対します。关键词式に対しますのに対しに対し。CPUを使用して计算を高速するにはは条件ありますますますますますますありありあり
关节は时期実なな単にますますますますしますさささものばませ実されるでなけれなりませすなわちれる原理ものを扱います。
データを分割し,複数の実行スレッドを管理する時間を含めても同時実行する価値があるように,データサイズは十分に大きいものを扱います。たとえば配列が数千個以上の要素を含む場合は,ほとんどの関数に対して高速化の効果があります。
処理がメモリに拘束されないものを扱います。すなわち処理時間の大部分がメモリのアクセス時間にならないものを扱います。一般的には,シンプルな処理より複雑な処理をする関数の方が,高速化の効果があります。
行列の乗算(X * Y)
と行列のべき乗(X ^ p)
の処理は,大規模な倍精度配列(10000個以上の要素)に対して計算負荷を増大させます。行列解析関数黛联
、rcond
、赫斯
、expm
も同様です。
技術計算の中で最も重要な問題の1つは,線形方程式を解くことです。
行列表記では一般的な問題は次のような形式になります。[2つの行列 A と b があるとき、Ax= b または xA= b の条件のいずれかを満たす一意の行列 x は存在しますか。]
1行1列の簡単な例を考えます。たとえば次の方程式について考えます。
7 x = 21
上記に一意の解は存在しますか。
もちろん存在します。この方程式には一意の解x = 3が存在します。解は除算から簡単に得られます。
X = 21/7 = 3
解を求める場合7の逆数すなわち7-1= 0.142857……を計算し,この7-1に21を乗算する方法は通常“使いません”。この方法では余計な計算ステップが必要となり,7-1を有限の小数値で打ち切ると精度も低下します。複数の未知数がある線形方程式にも同様の考え方で,MATLABは逆行列を使わずにこのような方程式を解きます。
標準の数学的な表記ではありませんが,MATLABではスカラーの場合と同じ除算記号を使用して一般的な連立方程式の解を記述します。2つの除算記号”スラッシュ”(/)および”バックスラッシュ”(\)が2つのmatlab关关mrdivide
およびmldivide
に対応します。これらの演算子は,係数行列の左右どちらかが未知の行列となる2つの状況で使用されます。
|
|
|
|
Ax = bまたはxA = bの方程式の両辺を一で割ると考えます。係数行列一个
「は「分」」ににます。
x = A \ b
に対する次元の整合性の条件は,2つの行列一个
とb
の行数が同じであることです。その結果,解x
はb
と同じ列数になり,行数は一个
の列数と同じになります。x = b / A
に対しては,行と列列のがします。
実際にはAx = bの形式の線形方程式の方がxA = bの形式より頻繁に使用されます。そのためバックスラッシュはスラッシュよりも頻繁に使用されます。この節の以降ではバックスラッシュ演算子を中心に説明します。スラッシュ演算子の特性は次の等式から推定できます。
(b / A) =(“\ b”)。
係数行列一个
は正方である必要はありません。一个
のサイズがm行n列である場合,次の3つのケースがあります。
m = n |
正方システム。厳密解が得られます。 |
m > n |
未知数より方程式が多い過決定システム。最小二乗解を求めます。 |
m < n |
未知数より方程式が少ない劣決定システム。最大でm個のゼロでない構成要素をもつ基底解を求めます。 |
mldivideアルゴリズム-mldivide
演算子は,さまざまなソルバーを使って各種の係数行列を処理します。実行するアルゴリズムは係数行列を調べて自動的に決められます。詳細については,関数mldivide
「│││││││││││││││││││││││││├
線形方程式系Ax = bの一般解は,すべての解を示します。次のようにして一般解を求めることができます。
対応する同次方程式Ax = 0を解きます。零
コマンドコマンド使用して「零(A)
“と入力します。これによって,Ax = 0の解空間の基底が返されます。どの解も基底ベクトルの線形結合になります。
非同次方程式Ax = bの特殊解を導出します。
AX = Bの解は,手顺2のx= bの特性解解手顺1の基因ベクトルの形形をを加入たものとして表现でき。
この節の以降では,MATLABを使用して手順2のAx = bの特殊解を導出する方法を説明します。
一般的な例は,正方係数行列一个
と右辺に単一の列ベクトルb
がある場合です。
特价でない源行列 -行程一个
が特異でない場合,x = A \ b
の解はb
と同じサイズになります。たとえば,
一个=帕斯卡(3);u = [3;1;4);x = A\u x = 10 -12
* x
がu
と等価であることを確認してください。
一个
とb
が正方で同じ同じサイズのの合并,x = A \ b
も同じサイズになります。
b =魔法(3);X = A \ b X = 19 13 6 0 6 3 1 -17 4
* x
がb
と等価であることを確認してください。
上記2つの例は,厳密に整数の解になります。これは係数行列がフルランク行列(特異でない)の帕斯卡(3)
であるであるです。
特異な係数行列-正方行列一个が線形に独立した列をもっていない場合を“特”異といいます。一个が特異な場合、Ax = b の解は存在しないかまたは一意ではありません。バックスラッシュ演算一个\ b
は,一个
が特異に近い場合か,厳密な特異性が検出された場合に警告を発します。
一个が特異でAx = bが解をもつ場合は,次のように入力することで一意ではない特殊解を導出できます。
p = pinv(a)* b
pinv (A)
は一の疑似逆行列です。斧= B.が厳密解をもたない場合、pinv (A)
は最小二乗解を返します。
たとえば,
A = [1 3 7 -1 4 4 1 10 18]
が特異であることは以下のように入力することでわかります。
rank(A) ans = 2
一个はフルランクではないため,いくつかの特異値がゼロに等しくなります。
厳密解。b = (5; 2; 12)
に対して,方程式Ax = bは次のような厳密解をもちます。
*b ans = 0.3850 -0.1103 - 0.7066
以下のようにににする,pinv b (A) *
が厳密解であることを確かめることができます。
A*pinv(A)*b ans = 5.0000 2.000 12.0000
最小二乘解。ただし,b =[3、6 0]
の場合,Ax = bは厳密解をもちません。この例の場合,pinv b (A) *
は最小二乘解を返します。以下のように入力すると,
a * pinv(a)* b ans = -1.0000 4.0000 2.0000
元のベクトルb
には戻りません。
AX = Bが厳密解をどうどうは,拡大行程[b]
をでではによってできようようなりなりなりなりなりなりなりなりなりなりなりなりなりなりなりになりなりなりなりなりなりなりなりなりなりなりなりなりなりなりなりなりにするなりなりなりなりなりなりなりなりなりなりなりするするする
rref([A b]) ans = 1.0000 0 2.2857 00 1.0000 1.5714 000 1.0000
最終行は最後の要素以外はすべてゼロであるため,方程式は解をもちません。この例の場合,pinv (A)
は最小二乗解を返します。
この例では,実験データでのさまざまな曲線近似において過決定システムが頻繁に発生することを説明します。
量y
は,時間t
のいくつかの異なる値で測定され,次の観測値を生成します。次のステートメントで,データを入力して表内に表示できます。
T = [0 .3 .8 1.1 1.6 2.3]';y =[。82 .72 .63 .60 .55 .50]';表(t, B = y)
B =6×2表T Y ___ ____ 0 0.82 0.3 0.72 0.8 0.63 1.1 0.6 1.6 0.55 2.3 0.5
減衰指数関数を使用してデータのモデル化を試します。
上記の式は,ベクトルy
が他の2つのベクトルの線形結合で近似されることを示しています。一方はすべて1の定数ベクトルであり,もう一方は成分exp (- t)
を含むベクトルです。未知の係数
および
E = [one (size(t))]
E =6×21.0000 1.0000 1.0000 0.7408 1.0000 0.4493 1.0000 0.3329 1.0000 0.2019 1.0000 0.1003
最小二乗解を求めるには,バックスラッシュ演算子を使用します。
c = E \ y
c =2×10.4760 - 0.3413
つまり,データの最小二乗近似は次のようになります。
次のステートメントでは,t
を等間隔にインクリメントしてモデルを評価し,結果を元のデータとともにプロットします。
T =(0:0.1:2.5)”;Y = [one (size(T)) exp(-T)]*c;情节(T Y“- - -”,t,y,“o”)
E * c
はy
と完全に等しくはありませんが,その差は元のデータの测定误差より小さくなっている可能性があります。
方形行列一个
は,線形独立の列がない場合はランク落ちとなります。一个
がランク落ちの場合,AX = B
の最小二乗解は一意ではありません。一个\ B
は一个
がランク落ちであり,最小二乗解を生成する場合に警告を発します。lsqminnorm
を使用して,すべての解の中で最小のノルムをもつ解X
を求めることができます。
この例では,劣決定システムの解が一意にならない理由について説明します。劣決定の線形システムは方程式より未知数の数が多くなります。MATLABの行程の左除算演算で基底最小二乗解を求めます。つまり、米
行n
列の数量行程にに,最大米
个个の非ゼロゼロののありありありありあり。
ここでは小さな乱数の例をあげます。
R = [6 8 7 3;3 5 4 1] rng(0);b =兰迪(2,1)
R = 6 7 8 3 3 5 4 1 b = 7 8
線形システムRp = b
には4つの未知数の中に2つの式があります。この係数行列に含まれる整数は小さいため,格式
コマンドを使用して有理数形式の解を表示するのが適切です。特殊解は次のステートメントで得られます。
格式老鼠p = r \ b
P = 0 17/7 0 -29/7
R (: 2)
はR
(2页)
になります。R (: 2)
を取り除くとR (: 4)
が最大ノルムをもつため,他のゼロ以外の要素は(4页)
になります。
劣決定システムの完全な一般解は,ヌル空間ベクトルの任意の線形結合にp
を付加することで特性化され,有理数で表示するオプションにより関数零
を使用して求められます。
Z = null (R,“r”)
z = -1/2 -7/6 -1/2 1/2 1 0 0 1
R * Z
がゼロになります。残差R * x - b
は,以下に示す任意のベクトルx
の場合は小さくなります。
x = p + Z*q
Z
の列はヌル空间ベクトルベクトルため,积Z *问
はこれらのベクトルの線形結合です。
説明のため,任意の问
を選択し,x
を作成します。
q = [2;1);x = p + Z*q;
残差のノルムを計算します。
格式短规范(R * x - b)
ans = 2.6645 e15汽油
解を無限に利用できる場合,最小ノルムをもつ解が特に重要となります。lsqminnorm
を使用して最小ノルムをもつ最小二乗解を計算することができます。この解は常态(P)
に対する可能な最小値をもちます。
p = lsqminnorm (R, b)
P = -207/137 365/137 79/137 -424/137
同一の係数行列一个
をもつが,异なる右辺b
をもつ線形システムを解く問題もあります。b
の異なる値が同時に使用できる場合は,b
をを数の列をもつ行列として成し,単一个のバックラッシュコマンドをししx = a \ [b1 b2 b3 ...]
のように方程式系全体を一度に解くことができます。
ただし,b
の異なる値がすべて同時に使用できない場合は,いくつかの方程式系を連続して解かなくてはなりません。これらの方程式系のいずれかをスラッシュ(/)またはバックスラッシュ(\)を使用して解く場合,演算子は係数行列一个
を因数分解し,この行列の分解を使用して解を計算します。ただし,異なるb
をもつ類似の方程式系を連続して解く場合,演算子は毎回同じ一个
の分类を演算するため演算演算となります。
この問題を解決するには,一个
の分解を事前計算してから,その因子を再利用して異なるb
の値の解を求めます。しかし実際には,この方法で分解を事前に計算することは困難です。その理由は,問題を解決するためにどの分解(LU,低密度脂蛋白,コレスキーなど)を計算するかだけでなく,因子をどのように乗算するかについても知る必要があるからです。たとえば,陆分解では,元のシステムAx = bを解くために次の2つの線形システムを解かなければなりません。
陆[L U] =(一个);x = U \ (L \ b);
代わりに,連続する複数の右辺をもつ線形システムを解くために推奨される方法は,分解
オブジェクトを使用する方法です。これらのオブジェクトによって,行列分解の事前計算によるパフォーマンス上の利点を活用できます。それらに,行列分解の使用方法に関する知識は必要的“ありません”。前述の陆分解を以下のように置き換えることができます。
dA =分解(,“陆”);x = dA \ b;
どの分解を使用すればよいかわからない場合は,分解(一)
によりバックスラッシュと同様に一个
のプロパティに基づいて正しいタイプを選択します。
この方法によるパフォーマンス上の利点を測定する簡単なテストを次に示します。このテストでは,バックスラッシュと(\)分解
の両方を使用して,同じスパース線形システムの解決を100回繰り返します。
n = 1 e3;A = sprand(n,n,0.2) + speye(n);b = 1 (n, 1);%反斜杠的解决方案抽搐为k = 1:100 x = A\b;结束toc
运行时间为9.006156秒。
%分解方案tic da =分解(a);为k = 1:100 x = dA\b;结束toc
运行时间为0.374347秒。
この問題では,分解
を使用した方法がバックスラッシュのみを使用した方法に比べてはるかに高速ですが,構文はシンプルです。
係数行列一个が大規模でスパース性がある場合,分解する方法は一般に効果がありません。反复法は近似解を生成できます.MATLABは大规模でスパース性のある行列を扱う,いくつかの反复法を用意しています。
MATLABは多数の线路幂关关数と要素ごと计算サポートしてます计算をサポートてますますを実さますます。关键やれます。关键词さます。关键词式に対しますささに対します。关键词式に対しますのに対しに対し。CPUを使用して计算を高速するにはは条件ありますますますますますますありありあり
关节は时期実なな単にますますますますしますさささものばませ実されるでなけれなりませすなわちれる原理ものを扱います。
データを分割し,複数の実行スレッドを管理する時間を含めても同時実行する価値があるように,データサイズは十分に大きいものを扱います。たとえば配列が数千個以上の要素を含む場合は,ほとんどの関数に対して高速化の効果があります。
処理がメモリに拘束されないものを扱います。すなわち処理時間の大部分がメモリのアクセス時間にならないものを扱います。一般的には,シンプルな処理より複雑な処理をする関数の方が,高速化の効果があります。
関数发票
、LSCOV.
、linsolve
、mldivide
はマルチスレッド計算を有効にすると,大規模な倍精度配列(10000個以上の要素)に対する計算速度が大幅に上昇します。
分解
|lsqminnorm
|mldivide
|mrdivide
|pinv
この節で説明する3つの因数分解では,対角要素の上部または下部の要素がすべてゼロである“三角行”“をを使い。三角行列を含む线路式は,“前进代入”または“後退代入“のいずれかを使うと,簡単かつ高速に解くことができます。
コレスキー分解は,対称行列を三角行列と転置行列との積として表現します。
一个= R或
ここでRは上三角行列です。
対称行列すべてがが方法で分类解わけではなく,适は,できる呼ばれてい値,非対角対角要素がすべてで,非対角要素が「大厦すぎない「」パスカルしています。パスカル行列をに行列この章ををますてのての一个
は3行3列のパスカル行列を扱いますが,ここでは一時的に6行6列の行列を作成します。
a = pascal(6)a = 1 11 11 11 11 11 2 3 4 5 6 11 6 10 15 21 11 4 10 20 35 5615 35 35 32626 126 252
一个
の要素は二項係数になります。各要素は上と左の要素の和になります。コレスキー分解は次のようになります。
R = 1 1 1 1 10 1 2 3 4 5 0 0 1 3 6 10 0 0 0 1 4 10 0 0 0 0 1 5 0 0 0
結果の要素は再び二項係数になります。‘* R
が一个
に等しいということは,一个
が二項係数の積の和を含んでいることを示しています。
コレスキー分解を使用すると,次の線形方程式
斧= B.
を次の式で置き換えることができます。
r'rx = B.
バックスラッシュ演算子は三角行列を認識するため,次のように高速に解くことができます。
x = r \(r'\ b)
一个
がn行n列の行列の場合,胆固醇(A)
の計算量はO (n3.)になりますが,バックスラッシュの計算量はO (n2)です。
lu分类またはガウスののははの正方行行为列,下三角行と上三角行行为の置换ののとして表しし。
一个=,
ここでLは対角要素に1をもつ下三角行列を並べ替えたもので,Uは上三角行列を並べ替えたものです。
並べ替えは理論上および計算上の面で必要になります。行程
は行を并べ替えと,三重行列の积としてすることはできませ。ただし,行列は次のようになります。
は三角行列の積として表すことができます。ε.が小さい場合、因子の要素は大きくなり誤差も大きくなります。よってこの並べ替えは厳密には必要ありませんが、推奨されます。部分ピボットは L の要素の大きさを 1 以下に制限し、U の要素が A の要素より大きくならないようにします。
たとえば,
[L,U] = LU(B)L = 1.0000 0 0 0.3750 0.5441 1.0000 0.5000 1.0000 0 U = 8.0000 1.0000 6.0000 0 8.5000 -1.0000 0 0 5.2941
一个
陆を分解すると,線形方程式
a * x = b
は次の式で高速に解くことができます。
x = u \(l \ b)
行列式と逆行列は,次の関係を使って陆分解から計算されます。
依据(A) =侦破(L) *侦破(U)
と
发票(A) =发票(U) *发票(左)
依据(A) = prod(诊断接头(U))
を使用して行列式を計算することもできますが,行列式の符号が逆になる場合があります。
“直”交行列または直交性の列がある行列とは,各列が単位長さをもち相互に直交関係になる実数行列です。问が直交であれば,
问TQ =我
ここで,我は単位行列です。
最も簡単な直交行列は2次元の座標回転変換です。
複素数行列に対応する概念は“ユニタリ” です。直交ユニタリ行列は长さと角度が保存され误差が大きくならないため,数値计算に效果的です。
直交分类またはqr分解は任意形形を,直交行列またはユニタリとし置换ますますしますます。
一个= QR
または
美联社= QR,
ここでQは直交行列またはユニタリ行列,Rは上三角行列,Pは置換行列です。
QR分解に,フルサイズとエコノミー,列置换列置换をもつものともたないもののもののもののありありもののもののもののありあり
過決定線形システムは,列よりも多くの行をもつ方形行列を含んでいます。すなわち,m行n列でm > nです。フルサイズのQR分解は,m行m列の正方直交行列问とm行n列の上三角行列Rを生成します。
C =画廊(uniformdata, 4 [5], 0);(Q, R) = qr (C) Q = 0.6191 0.1406 -0.1899 -0.5058 0.5522 0.1506 0.4084 0.5034 0.5974 0.4475 0.3954 -0.5564 0.6869 -0.1478 -0.2008 0.3167 0.6676 0.1351 -0.1729 -0.6370 0.5808 -0.2410 -0.4695 0.5792 -0.2207 R = 1.5346 1.0663 1.2010 1.4036 0.7245 0.3474 -0.0126 0 0 0.9320 0.6596 0.6648 0 0 0 0 0 0 0
多くの场合,Qの最后の米 - N列は - [Rの下部にゼロを乘算することになるため必要ありませんしたがってエコノミーサイズのQR分解は,直交要素をもつ米行Ñ列の方形行列Qと,正方のn行n列生成し行列この5行4列例では大大影响はありませが,非常非常大师方形行列ののは,时间とメモリがされるれる値値ではではこの法が非常にに效果的になります。
[Q,R] = qr(C,0) Q = 0.6191 0.1406 -0.1899 -0.5058 0.1506 0.4084 0.5034 0.5974 0.3954 -0.5564 0.6869 -0.1478 0.3167 0.6676 0.1351 -0.1729 0.5808 -0.2410 -0.4695 0.5792 R = 1.5346 1.0663 1.2010 1.4036 0 0.7245 0.3474 -0.0126 0 0 0.9320 0.6596 0 0 0 0.6648
Lu分享到は异なり,QR分类はピボットやははありませんん必要必要のませんをすると,オプションの列置换がされ,特点性ランクを调べる调べるににですを调べるににに。ステップでは,分享ししていない残りの列の列のので大声ノルムノルムを列がそのステップでのの底として使われれれれれれれれれれれれれによりののの対角さい顺に并べることができの対角并べる并べることができことができことができ并べる并べることができことができ并べる并べる并べることができことができ并べる并べる并べる并べる并べる并べる并べる并べる并べる并べる并べる并べる并べることができ间谍关键词を调べるによって各列ののにに形にする依存ことができでこの単にすることができことができでははにするな例では,C
の2列目は1列目のノルムよりも大きいノルムをもちます。そこで2つの列を交換します。
[Q,R,P] = qr(C) Q = -0.3522 0.8398 -0.4131 -0.7044 -0.5285 -0.4739 -0.6163 0.1241 0.7777 R = -11.3578 -8.2762 0 7.2460 0 0 P = 0 11 0
エコノミーサイズと列の置換を組み合わせると,3番目の出力引数は置換行列ではなく置換ベクトルになります。
[Q,R,p] = qr(C,0) Q = -0.3522 0.8398 -0.7044 -0.5285 -0.6163 0.1241 R = -11.3578 -8.2762 0 7.2460 p = 2
QR分解では過決定の線形方程式を等価な三角行列に変換します。次の式を見てみましょう。
规范(A * x - b)
は以下と等価です。
规范(Q * R * x - b)
直交行列の乗算はユークリッドノルムを保存するため,この式は以下と同じです。
规范(R * x - y)
ここでy =问' * b
です。Rの最後の m-n 行はゼロであるため、この式は 2 つに分けられます。
Norm(r(1:n,1:n)* x - y(1:n))
と
规范(y (n + 1: m))
一个
がフルランクの場合はx
に対して解くことができ,最初の式はゼロになります。次に2番目の式が残差のノルムを指定します。一个
がフルランクでないでないは,R
の三角构造から最小二乘问题に対する基于解をします。
MATLABは多数の線形関数と要素ごとに計算する数値関数のマルチスレッド計算をサポートしています。これらの関数は自動的にマルチスレッドで実行されます。関数や式に対し、複数の CPU を使用して計算を高速化するにはさまざまな条件があります。
关节は时期実なな単にますますますますしますさささものばませ実されるでなけれなりませすなわちれる原理ものを扱います。
データを分割し,複数の実行スレッドを管理する時間を含めても同時実行する価値があるように,データサイズは十分に大きいものを扱います。たとえば配列が数千個以上の要素を含む場合は,ほとんどの関数に対して高速化の効果があります。
処理がメモリに拘束されないものを扱います。すなわち処理時間の大部分がメモリのアクセス時間にならないものを扱います。一般的には,シンプルな処理より複雑な処理をする関数の方が,高速化の効果があります。
このトピックでは,さまざまな方法を使用して行列のべき乗と指数を計算する方法を説明します。
正の整数のべき乗
一个
が正方行列でp
が正の整数の場合,^ p
は一个
をそれ自身にp - 1
回回します。以下に例を示し。
A = [1 1 1 1 2 3 1 3 6];^ 2
ans =3×33 6 10 6 14 25 10 25 46
逆数と分数ののべき
一个
が正方行列で特異でない場合,^ (- p)
は发票(一个)
をp - 1
回乗算します。
A ^( - 3)
ans =3×3145.0000 -207.0000 81.0000 -207.0000 298.0000 -117.0000 81.0000 -117.0000 46.0000
MATLAB®では发票(一个)
とA ^( - 1)
が同じアルゴリズムで計算されるため,結果はまったく同じになります。行列が特異に近くなる場合,发票(一个)
とA ^( - 1)
はどちらも警告を発生させます。
isequal(发票(A)、^ (1))
ans =逻辑1
^ (2/3)
ののな分数の乘乘计算可です。分数の乘を使使使は,行程はははののはなり値のによってによってなりますのによってによってなります。
^ (2/3)
ans =3×30.8901 0.5882 0.3684 0.5882 1.2035 1.3799 0.3684 1.3799 3.1167
要素単位のべき乗
^。
たとえば,行程のの各要素をするにはべきするにに要素にするにははべきするににに二乘するにA. ^ 2
を使用できます。
A. ^ 2
ans =3×31 1 1 4 9 1 9 36
平方根
関数√6
は,行列の各要素の平方根を计算するのに便利な方法です。これを行う代替方法は答:^ (1/2)
です。
sqrt ()
ans =3×31.0000 1.0000 1.0000 1.0000 1.4142 1.7321 1.0000 1.7321 2.4495
他の根にはnthroot
たとえば,答:^ (1/3)
を計算します。
nthroot (3)
ans =3×31.0000 1.0000 1.0000 1.0000 1.2599 1.4422 1.0000 1.4422 1.8171
これらの要素ごとの根は,
となるように第2の行列
が計算される,行列の平方根とは異なります。関数sqrtm (A)
は,より正確なアルゴリズムによって^ (1/2)
を計算します。sqrtm
の中の米
によって,この関数はsqrt ()
と区別されますが,後者は答:^ (1/2)
と同様に要素ごとに計算を行います。
B = sqrtm (A)
B =3×30.8775 0.387 0.1937 0.387 1.0099 0.8874 0.1937 0.8874 2.2749
B ^ 2.
ans =3×31.0000 1.0000 1.0000 1.0000 2.0000 3.0000 1.0000 3.0000 6.0000
スカラー基底
行列をべき乗にするだけでなく,スカラーを行列のべき乗にすることもできます。
2 ^
ans =3×310.4630 21.6602 38.5862 21.6602 53.2807 94.6010 38.5862 94.6010173.7734
スカラーを行列のべき乗にする場合,MATLABは行列の固有値と固有ベクトルを使用して行列のべき乗を計算します。[V D] = eig (A)
の場合は,
となります。
[V D] = eig(一个);V * 2 ^ D * ^ (1)
ans =3×310.4630 21.6602 38.5862 21.6602 53.2807 94.6010 38.5862 94.6010173.7734
行列の数
行列指数は,スカラーを行列のべき乗にする特殊なケースです。行列指数の基底はオイラー数e = exp (1)
です。
e = exp(1);e ^ A.
ans =3×3103.× 0.1008 0.2407 0.4368 0.2407 0.5867 1.0654 0.4368 1.0654 1.9418
行列指数を計算するには,関数expm
がより便利です。
expm (A)
ans =3×3103.× 0.1008 0.2407 0.4368 0.2407 0.5867 1.0654 0.4368 1.0654 1.9418
行列指数の計算方法はいくつかあります。詳細については,行列の数を参照してください。
小さい数値の処理
MATLAB関数log1p
およびexpm1
は,
の非常に小さい値について
と
を正式に计算し。たとえば,マシンの精密より小さい数码を1に加入しようとと,结果は1に丸められ。
日志(1 + eps / 2)
ans = 0
しかし,log1p
は,より精度の高い解を返すことができます。
log1p (eps / 2)
ans = 1.1102 e-16
同様に では, がが非常小さいとゼロ丸め丸めます。
exp (eps / 2) 1
ans = 0
この場合も,expm1
は,より精度の高い解を返すことができます。
expm1 (eps / 2)
ans = 1.1102 e-16
经验值
|expm
|expm1
|mpower
|nthroot
|权力
|√6
|sqrtm
正方行列の”固有値”と”固有ベクトル”は,次の关键词満たすスカラーλλゼロゼロのベクトルで表します。
Aυ = λυ。
対角行列λの対角対角要素要素要素にを配置し,行程vの列対応するするベクトル配置すると,次の配置する,次のようとと。
Av = vΛ。
Vが特異でない場合,これは固有値分解になります。
一个= VΛV1。
このこの分方程dx / dt = Axの係数行列は良い例です。
A = 0 -6 -1 6 2 -16 -5 20 -10
この方程式の解は,行列指数x (t) = e助教x (0)で表されます。ステートメント
λ= eig (A)
は,一个
の固有値を含む列ベクトルを作成します。この行列の例の固有値は複素数になります。
Lambda = -3.0710 -2.4645+17.6008i -2.4645-17.6008i
各固有値の実数部は負で,eλt.はTが増加するとゼロにますますますの部部の以の部±ωは,分段方程式式ののの构ー构
2つの出力引数を設定するとeig
は固有ベクトルを計算し,対角に固有値を出力します。
[V D] = eig (A)
V = -0.8326 0.2003 - 0.1394i 0.2003 + 0.1394i -0.3553 -0.2110 - 0.6447i -0.2110 + 0.6447i -0.4248 -0.6930 -0.6930
最初の固有ベクトルは実数で,他の2つのベクトルは互いに複素共役になっています。3つのベクトルはすべてユークリッド長で,常态(v,2)
が1になるように正規化されています。
V * D / V
を簡潔に表現できる行列v * d * inv(v)
は,一个
のの丸め误差の范囲内に入ります入り入り入り入り入り入り入り入り发票(V) * * V
またはv \ a * v
はD
の丸め誤差の範囲内に入ります。
固有ベクトル分解できない行列もあります。これらの行列は対角化できません。たとえば,
a = [1 -2 1 0 1 4 0 0 3]
この行列に対して,
[V D] = eig (A)
は,以下の結果を出力します。
V = 1.0000 1.0000 -0.5571 0 0.0000 0.7428 00 0.3714 d = 1 000 1 000 3
λ= 1の場合2つの固有値が存在します。V
の1番目と2番目の列は同じです。この行列に対して,完全に線形に独立した固有ベクトルの組は存在しません。
高度な行列計算の多くは固有値分解を必要としません。代わりに舒尔分解を使います。
一个=一般'
ここでUは直交行列で,年代は1行1列および2行2列のブロックを対角要素にもつ上三角行列のブロックです。固有値は対角要素と年代のブロックで表されます。一方,Uの列は固有ベクトルよりも数値特性の良い直交基底を与えます。
たとえば,このフルランクではない行列の固有値と舒尔分解を比較します。
A = [6 12 19 -9 -20 -33 4 9 15];[V D] = eig (A)
我V = -0.4741 + 0.0000 -0.4082 - 0.0000 -0.4082 0.8127 + 0.0000 + 0.0000我0.8165 + 0.0000我0.8165 + 0.0000 -0.3386 -0.4082 + 0.0000 + 0.0000我我-0.4082 - 0.0000 D = -1.0000 + 0.0000 0.0000 0.0000 + 0.0000 + 0.0000我0.0000 + 0.0000我1.0000 + 0.0000 0.0000 0.0000 + 0.0000 + 0.0000我0.0000 + 0.0000我1.0000 - 0.0000
[U S] =舒尔(A)
U = -0.4741 0.6648 0.5774 0.8127 0.0782 0.5774 -0.3386 -0.7430 0.5774 s = -1.0000 20.7846 -44.6948 0 1.0000 -0.6096 0 0.0000 1.0000
完全に線形に独立した固有ベクトルの組は存在しない(V
の2列目と3列目が同じ)ため,行列一个
はフルランクではありません。V
の一部の列が線形に独立していないので,それは約~1E8.
の大きな条件数をもちます。ただし,舒尔
は,U
の3つの異なる基底ベクトルを計算できます。U
は直交であるため,电导率(U) = 1
となります。
行程年代
は,対角の最初のエントリとして実固有値,および2行2列のブロックの右下隅で表される反復固有値をもちます。2行2列のブロックの固有値は,一个
の固有値でもあります。
eig (S (2:3, 2:3))
ANS = 1.0000 + 0.0000i 1.0000 - 0.0000i
方形行の列“特異値”と対応する特異ベクトルは,スカラーσとu vとの1組のベクトルで表され,次の式を満たします。
ここで,
は一のエルミート転置です。通常,特異ベクトルuとvはノルムが1になるようにスケーリングされます。またuとvがの特異ベクトルである場合は,- uと- vも一个
の特異ベクトルです。
特異値σは,が複素数であっても,常に非負の実数です。対角行列Σに特異値を配置します。これに対応する特異ベクトルは2つの直交行列UとVの列からなり,次のような方程式が導出されます。
UとVはユニタリ行列であるため,最初の方程式に右側から を乗算すると,特異値分解の方程式が導出されます。
m行n列の行列の非スパースな特異値分解は,次で表されます。
m行m列の行列u
M行n列列行σ
n行n列の行列V
言い換えればUとVは共に正方で,Σは一と同じサイズです。一个の行数が列数よりずっと多い場合(m > n
),结果结果米
行米
列の行列Uは大きくなります。ただし,Uのほとんどの列は Σ のゼロで乗算されます。このような場合“〖”で“で分享すると,m行n列u,n行n列σ,同じvが作用成れ,计算时空もれ节约さますれます。
常微分方程式を表現する場合ように,あるベクトル空間内でマッピングを行う場合,固有値分解はその行列の解析に適切な方法になります。ただし,あるベクトル空間から他のベクトル空間へマッピングする行列を解析する場合は特異値分解が適切な方法になります。特異値分解は異なる次元についても扱えます。ほとんどの連立線形方程式は,この2番目の方法のカテゴリに入ります。
aが正方,対称,かつ正式値のは,この固およびはなりでない値値対称値値でない场なりなり结果ズレ大大なります。特大派なりますのズレ大厦なり。特大数目ます。特大派なり。の特价値分类は常に数ですが,実数の非対称行の固値ありますになることあります。
例として行列を作成します。
A = 9 4 6 8 2 7
一个に対して非スパースな特異値分解は次のようになります。
[U,S,V] = SVD(a)u = 0.6105 -0.7174 0.3355 0.6646 0.2336 -0.7098 0.4308 0.6563 0.6194 S = 14.9359 0 0 5.1883 0 0 V = 0.6925 -0.7214 0.7214 0.6925
U * * V”
が丸め誤差の範囲内で一个
に等しいことが确かめられますこのな小さな行列问题をエコノミーサイズででと,わずかですが使使サイズサイズ小さくできます。
[U,S,V] = svd(A,0) U = 0.6105 -0.7174 0.6646 0.2336 0.4308 0.6563 S = 14.9359 0 0 5.1883 V = 0.6925 -0.7214 0.7214 0.6925
U * * V”
が丸め誤差の範囲内で一个
にに等しいことをを再确认できでき
大規模なスパース行列では,圣言会
をを用して”“すべての特異値と特異ベクトルを計算することは,必ずしも現実的ではありません。たとえば,最も大きい特異値をいくつかだけ知る必要がある場合に、5000 行 5000 列のスパース行列の特異値をすべて計算するのは余分な作業となります。
特異値と特異ベクトルのサブセットのみが必要な場合は,関数圣言会
よりも,关节圣言会
と関数svdsketch
が推奨されます。
関数 | 使用方法 |
---|---|
圣言会 |
圣言会 ,SVDによるランクkの近似近似を计算しし近似するかかかにするかにかをのする最するをのする最するかのサブセット最しに近似近似をを计算しを近似をををし近似近似近似近似し近似近似近似近似近似近似近似近似近似近似近似计算近似近似近似近似近似近似近似近似近似近似近似近似をを近似近似近似近似近似近似近似し近似近似近似近似近似をするするかのするするl圣言会 は一般的に,ランクkの最適な近似を計算します。 |
svdsketch |
svdsketch をを用して,指定された许容误差満たす,入力行为ののなsvdを计算し。圣言会 ではランクを指定する必要がありますが,svdsketch では指定された許容誤差に基づき,行列スケッチのランクが適応的に特定されます。svdsketch が最终的に使使用するランクkの近似は许容误差をますが,圣言会 と異なり,最適なものであることは保証されません。 |
たとえば,密度が约30%である,1000行1000列のランダムな列列考えてます。
n = 1000;一个= sprand (n, n, 0.3);
6つの最大特異値は次のようになります。
S = svds(A) S = 130.2184 16.4358 16.4119 16.3688 16.3242 16.2838
また6つの最小特異値は次のようになります。
S = svds(A,6,'最小'
行列が比較的小さく,非スパース行列完整的(一个)
としてメモリに収まる場合は,圣言会
やsvdsketch
よりも圣言(全(A))
を使用するほうが依然として高速になることがあります。ただし,非常に大規模なスパース行列の場合は,圣言会
やsvdsketch
の使用が必要になります。