将矩阵对角线转换为列



我正在寻找以下形式的矩阵运算:B = M*A*N其中A是一些通用方阵,MN是我想找到的矩阵。 这样B列就是A的对角线。第一列是主对角线,第二列是对角线与主对角线偏移 1,依此类推。

例如,在 MATLAB 语法中:

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

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

编辑: 似乎不存在纯线性代数解。所以我会更准确地说明我想要做什么:

对于某些大小为1 x m的矢量v。然后定义C = repmat(v,m,1)。我的矩阵是A = C-C.';. 因此,A本质上是v值的所有差异,但我只对值之间的一定距离的差异感兴趣。 这些是A的对角线;但是m太大,以至于构造这样的m x m矩阵会导致内存不足问题。 我正在寻找一种以尽可能高效的方式(在 MATLAB 中)提取这些对角线的方法。

谢谢!

如果你实际上不是在寻找线性代数解,那么我认为使用两个矩阵乘法构造三个与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。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].'

您可以通过移动v元素来构造此对角线而无需构造A甚至B

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

主对角线由k = 0给出,最后一个对角线由k = m-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

相关内容

  • 没有找到相关文章

最新更新