2017-01-04 4 views
1

B = M*A*Nの行列演算を探しています。ここで、Aはいくつかの一般正方行列で、MNは検索したい行列です。 Bの列はAの対角線になります。最初の列は主対角線であり、2番目の対角は主から1だけシフトされています。行列の対角を列に変換する

MATLABの構文で:

A = [1, 2, 3 
    4, 5, 6 
    7, 8, 9] 

B = [1, 2, 3 
    5, 6, 4 
    9, 7, 8] 

編集: 純粋な線形代数のソリューションが存在しないようです。だから私は何をしようとしていたのかもっと正確になるでしょう:

vのサイズはです。次に、C = repmat(v,m,1)を定義します。私の行列はA = C-C.';です。 したがって、Aは本質的にvの値のすべての違いですが、私は値の間のある程度の距離にのみ興味があります。 これらは対角線のAです。 mは非常に大きいので、そのようなm x m行列の構成はメモリ不足の問題を引き起こします。 私は可能な限り効率的な方法で(MATLABで)それらの対角線を抽出する方法を探しています。

ありがとうございます!

+0

'M'と' N'の間にはどのような関係がありますか? 'N' =' M'^-1ですか?これは問題を単純化する –

+1

あなたは事実上1つの方程式( 'B = M * A * N')と2つの未知数(' M'と 'N')を持っています。あるいは、与えられた 'A'に対して行列' B'を設定する関数だけが必要ですか? – Wolfie

+0

はい。 MとNには自由がありますが、私はそれらの間の関係は知らないのです。変換は、一般的なAとM Nのいくつかの定数行列に対してちょうどうまくいくはずです。 – AsaridBeck91

答えて

0

実際に線形代数解を探していないのであれば、2つの行列乗算を使うAと同じサイズの3つの追加行列を構成することは、時間と空間の複雑さの両方で非常に非効率的であると主張します。線形代数についての私の知識が限られているので、マトリックス解を見つけることさえ可能だとは思えませんが、それが厄介であっても確かです。

あなたが唯一のいくつかの対角線に沿って値を必要とすると言うので、私はdiagを使用してのみ対角線を構築したい:

A = [1 2 3; 
    4 5 6; 
    7 8 9]; 
m = size(A, 1); % assume A is square 
k = 1;   % let's get the k'th diagonal 
kdiag = [diag(A, k); diag(A, k-m)]; 

kdiag = 

    2 
    6 
    7 

対角線0mxm行列用)m-1対角線、主対角があるさ最終。だから、あなたは簡単にループBのすべてをできたい場合:サイズ1xmのいくつかのベクトルVについて

B = zeros(size(A)); 
for k = 0:m-1 
    B(:,k+1) = [diag(A, k); diag(A, k-m)]; 
end 

B = 

    1 2 3 
    5 6 4 
    9 7 8 

コメントを。次に、B = repmat(v、m、1)。私の行列はA = B-Bです。 Aは本質的にvの値のすべての違いですが、私は値の間のある距離までの差にのみ興味があります。

あなたが全体の行列を構成した場合のは

B = repmat(v, m, 1); 
A = B - B.'; 

A = 
    0 2 6 10 
    -2 0 4 8 
    -6 -4 0 4 
    -10 -8 -4 0 

は、主対角がゼロであるので、それは非常に興味深いではありません、

m = 4; 
v = [1 3 7 11]; 

を言ってみましょう。

k = 1; 
diag1 = circshift(v, m-k, 2) - v; 

diag1 = 

    2 4 4 -10 

主対角がk = 0で与えられます。私はk = 1と呼ぶことにしますこれは、次の対角線は、あなたがvの要素をシフトすることによりAあるいはBを構築することなく、この対角線を構築することができ

[2 4 4 -10].' 

です最後の対角線はk = m-1です。

+0

はい、それはうまくいくでしょうが、私の考えは、最初のような大きな行列に頼る必要がないように、線形代数解を使うことでした。私はそれを明確にすべきだった。 – AsaridBeck91

+0

私はあなたが何を提案しているのか分かりません。 'B = M * A * N'を使うと、4つの' mxm'行列があります。この方法を使うと、オリジナルの行列と、実際に必要な多くの 'mx1'の対角だけがあります。 – beaker

+0

あなたは正しいですが、この操作を実行したい特定の行列は長さmのベクトルから構築されます。 mは約1e6である。私のMATLABは、このようなmを持つゼロ行列を作成することはできません。私は行列のない対角線にまっすぐ進む必要がありました。しかし、私は一般的な代数的解が存在しないと考えているので、このアプローチは良くないと思われる。 – AsaridBeck91

0

あなたがそうのように、Aを並べ替えに使用する、その後、入れ替えのために列インデックスを作成linear indexにそれらを変換する機能toeplitzを使用してこの操作を行うことができます。これは、任意のサイズの正方行列に一般化されます

>> A = [1 2 3; 4 5 6; 7 8 9] 
A = 
    1  2  3 
    4  5  6 
    7  8  9 
>> n = size(A, 1); 
>> index = repmat((1:n).', 1, n)+n*(toeplitz([1 n:-1:2], 1:n)-1); 
>> B = zeros(n); 
>> B(index) = A 
B = 
    1  2  3 
    5  6  4 
    9  7  8 

A