rank
シンボリック行列のランクを求める
構文
説明
例
行列のランクを求める
syms a b c d A = [a b; c d]; rank(A)
ans = 2
シンボリック行列のランクは正確
シンボリック計算は厳密な行列のランクを返しますが、数値計算は丸め誤差の影響を受けることがあります。この厳密な計算は、ヒルベルト行列のような悪条件である行列に有用です。次数 n のヒルベルト行列のランクは n です。
次数 15
のヒルベルト行列のランクを数値計算で求めます。次に sym
を使用して、数値行列をシンボリック行列に変換して、ランクをシンボリック計算で求めます。
H = hilb(15); rank(H) rank(sym(H))
ans = 12 ans = 15
シンボリック計算は正しいランクである 15
を返します。数値計算は、丸め誤差が原因で、間違ったランクの 12
を返します。
関数 rank はシンボリック計算を単純化しない
次の行列を考えます。
1-sin(x)^2
から cos(x)^2
への単純化の後、行列はランク 1
になります。しかし、rank
では、行列要素で発生する特殊関数によって満たされる恒等を考慮しないため、間違ったランク 2
を返します。その間違った結果は以下になります。
syms x A = [1-sin(x) cos(x); cos(x) 1+sin(x)]; rank(A)
ans = 2
中間ステップの出力は単純化されないため、rank
は間違った結果を返します。フェイルセーフの回避策はありませんが、数値を代入し、vpa
を使用して代入を評価することで、シンボリック式を単純化できます。
x
に数値を代入し、vpa
を使用して結果を評価することで、正しいランクを求めます。
rank(vpa(subs(A,x,1)))
ans = 1
ただし、数値の代入後も、rank
は丸め誤差が原因で間違った結果を返す場合があります。
入力引数
バージョン履歴
R2006a より前に導入