4

編集:

@yoda と @morispaa に感謝します。あなたはどちらも正しく、@morispaaのソリューションは機能します。つまり、 Zがまたがる空間に関する仮定に基づく変換された係数の私の処理、およびZベクトルの順序「方向」は、更新すると正しい結果をレンダリングしますRの対角要素が正の要素を持つように、 Qの列の符号を変更します。

私が取り組んでいる変換の詳細については、こちらをお読みください。以下のZ = サンプリングされたゼルニケ多項式。これは、離散ケース (私たちのケース) で直交または完全ではないことが知られています。

@morispaa によって提案されたソリューションが機能する理由についての直感。それについてあなたの意見を聞きたいです:

私の直感では、Rの実数の非負の対角線を何らかの形で適用すると、基底QがZのベクトルと「一致する」ようになり(前に述べたように、ユニタリではありません)、したがって以下のオプション 1 と 2 が得られるということです。それらは異なる変換を表していますが、出力係数はおそらく同様の空間にあります。

より具体的には、Zは「ほぼ」ユニタリであり、これによりQR分解がZに十分近い基底を返すようになるのではないでしょうか? そうして初めて、 Zのベクトルの詳細に関する仮定に基づく変換された係数の処理が、 Qの対角が完全に正の場合は機能するが、負のエントリがある場合は機能しないと想像できます。どう思いますか?

バックグラウンド

MATLAB R2011aR2010bの両方がマシンにインストールされています。

R2010bからR2011aへの変更の 1 つは、の実装に影響しますqr()(この特定の変更に関するリリース ノートはこちらを参照してください)。

qr()私のプロジェクトが直接および逆変換の直交基底を推定するために使用するものの重要な部分。私のコードは、この変換を入力信号に適用し、変換された係数を処理して、処理された信号を返します。つまり、R2011aで行われた変更によりqr()、この変換の係数を処理するブロックが機能しなくなります (逆変換は、処理された信号の期待される逆変換を返しません)。

どういうわけか、現在返されているQマトリックスはqr()、変換された係数の処理が適切に機能しないという点で、古いバージョンとは異なります。

最初の質問

以上のことから、 R2010bからR2011aを使用するように指示することは可能ですか?qr()

2 番目の質問

QQ'を使用して、直接変換と逆変換を計算します。詳細はこちらでご覧いただけます。より具体的には、y = Q * xx = Q' * yを使用して、それぞれ直接変換と逆変換を計算します。直接変換を計算する別の方法は、最小二乗法を使用することです。つまり、次の 2 つのオプションがあります。

オプション 1: QR 因数分解を使用した直接および逆変換:

% Direct:
[Q R] = qr(Z);
y = Q' * x;

% Some processing of the y coefficients
% ...

% Inverse:
x = Q*y;

オプション 2: 最小二乗フィッティングによる直接変換と逆変換

% Direct:
y = Z \ x;

% Some processing of the y coefficients
% ...

% Inverse:
x = Z*y;

変数は次のとおりです。

% x = Input vector
% y = Direct transformation of x
% Z = Matrix with sampled basis

R2011a では、上記のオプション 1が機能しなくなりました ( R2010bでは機能します)。直接変換と逆変換に使用するというアイデアが本当に気に入っていqr()ます (すべての新しいベクトルの最小二乗を計算するよりもはるかに高速です)。私のプロジェクトに新しいものを使用したい場合、私の変換を新しいQqr()で再び機能させる方法を知っている人はいますか?

4

2 に答える 2

2

次のようにバージョン 2010b の動作を復元できると思います (現時点では MATLAB を手元に持っていません)。

[Q R] = qr(Z);
D = diag(sign(diag(R)));
R2 = D*R;
Q2 = Q*D;

これR2で、上三角になり、対角が正になり、Q2直交 (またはユニタリー) のままになり、Q2*R2 = Z. 複雑なケースでの使用

R2 = D'*R;
Q2 = Q*D;
于 2011-05-03T09:38:00.847 に答える
2

QR分解ではA=QRRは上三角行列です。行列Ainvertibleである場合、実数の非負の対角要素を持つ条件を課せば、因数分解は一意になります。Rこの条件を緩和すると、直交行列Qと上三角行列Rが得られますが、一意である必要はありません。

分解の非一意性はしばしば人々を混乱させるので、私のお気に入りの例の 1 つである恒等行列の固有ベクトルを紹介したいと思います。

あなたが提供したリンクから:

互換性に関する考慮事項: QR 因数分解は一意ではないため、これらの異なる結果は依然として正しいです。コードが因数 Q および R の要素の値に依存していないことを確認してください。

これはあなたのコードで起こっていることですか?Qとの形に依存しますRか?

簡単な修正として、次からこれを試していただけますかR2010b:

which qr.m

私のマシンでは、/Applications/MATLAB_R2010b.app/toolbox/matlab/matfun/qr.m. この関数をコピーしてR2011パスに配置し、名前を変更してみてくださいqr2010。その後、古い関数が必要なときはいつでもqr2010、最新バージョンの MATLAB から呼び出すことができ、古いアルゴリズムを使用する必要があります。私はこれをテストしていないので、うまくいくかどうか教えてください。

編集

マシンにインストールR2011aしてチェックアウトしましたqr。私が言ったように、正の対角線を強制しないと、要素の符号の組み合わせが異なり、ソリューションが一意ではなくなります。ただし、順変換と逆変換は機能するはずであり、私のマシンでは機能します。

A=magic(5);x=(1:5)';   %'
[Q R]=qr(A);
y=Q'*x;                %'
z=Q*y;

z'

ans =

    1.0000    2.0000    3.0000    4.0000    5.0000

R2011aと の両方で同じ結果が得られR2010bます。したがって、私の推測では、どういうわけか対角線が正であることに依存していると思われますが、これはおそらく良いことではありません。

ただし、コードを保持したいが、代わりに newqrを取得して と同じ行列を返すR2010b場合は、morispaa の提案を使用する必要があります。

編集2

morispaa の解の説明:2010bでは、 の対角線は でR同じ動作を得るために正であるため、対角線の符号を取得し、それを行列2011a全体に伝播するだけで済みます。R上記の私の例でRは、

R =

  -32.4808  -26.6311  -21.3973  -23.7063  -25.8615
         0   19.8943   12.3234    1.9439    4.0856
         0         0  -24.3985  -11.6316   -3.7415
         0         0         0  -20.0982   -9.9739
         0         0         0         0  -16.0005

そしてD_

D =

    -1     0     0     0     0
     0     1     0     0     0
     0     0    -1     0     0
     0     0     0    -1     0
     0     0     0     0    -1

の対角線はR自動的に正になります ( と同じくらい簡単-1*-1=1です)。同様に、Q行列で符号を伝播します。D*Dは単に対角行列の要素の 2 乗であり、単位行列 に等しいことに注意してくださいI。したがって、

 Q2*R2=Q*D*D*R
      =Q*I*R
      =Q*R
      =A
于 2011-05-03T07:11:29.603 に答える