1

次の形式の行列演算を探しています。B = M*A*NwhereAは一般的な正方行列であり、MおよびNは見つけたい行列です。の列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サイズのベクトルの場合1 x m。次に を定義しますC = repmat(v,m,1)。私の行列はA = C-C.';です。したがって、A本質的には値のすべての違いですが、値v間の距離までの違いにのみ興味があります。これらは の対角線ですA。しかし、m非常に大きいため、このようなm x m行列を構築するとメモリ不足の問題が発生します。(MATLAB で) 可能な限り効率的な方法でこれらの対角線を抽出する方法を探しています。

ありがとう!

4

2 に答える 2

1

実際に線形代数のソリューションを探していない場合は、A2 つの行列乗算を使用するのと同じサイズの 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

対角線0はメインの対角線で、対角線m-1(mxm行列の場合) は最後の対角線です。Bしたがって、すべてを簡単にループできるようにしたい場合は、次のようにします。

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

コメントから:

v に対して、サイズ 1xm のベクトル。次に、B=repmat(v,m,1) です。私の行列は A=BB です。A は本質的に v の値のすべての違いですが、値間の距離までの違いにのみ関心があります。

まあ言ってみれば

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

行列全体を構築すると、

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

主な対角線はゼロなので、あまり興味深いものではありません。私が呼ぶ次の対角線k = 1

[2 4 4 -10].'

Aの要素を構築せずに、またはBシフトすることによっても、この対角線を構築できますv

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

diag1 =

    2    4    4  -10

主対角線は で与えられk = 0、最後の対角線は で与えられk = m-1ます。

于 2017-01-04T23:58:03.723 に答える
1

これは、関数toeplitzを使用して再シャッフル用の列インデックスを作成し、それらを並べ替えに使用する線形インデックスAに変換することで実行できます。

>> 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

于 2017-01-05T21:34:40.290 に答える