将矩阵对角线转换为

时间:2017-01-04 12:50:55

标签: matlab linear algebra matrix-decomposition

我正在寻找表格的矩阵运算:B = M*A*N其中A是一般的方阵,MN是我想要找到的矩阵。 这样B的列是A的对角线。第一列是主对角线,第二列是对角线从主要位置移动了1,依此类推。

e.g。在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中)。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您实际上并未寻找线性代数解决方案,那么我认为使用两个矩阵乘法构造与A相同大小的三个额外矩阵在时间和空间复杂度方面效率非常低。鉴于我对线性代数的了解有限,我不确定它是否有可能找到矩阵解决方案,但即使它确实很麻烦。

由于您说您只需要沿某些对角线的值,我只使用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 = B-B。&#39 ;; 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给出。

答案 1 :(得分:1)

您可以使用函数toeplitz为重新洗牌创建列索引,然后将其转换为linear index以用于重新排序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