Matlab 将矩阵对角线旋转为列

Matlab 将矩阵对角线旋转为列,matlab,linear-algebra,algebra,matrix-decomposition,Matlab,Linear Algebra,Algebra,Matrix Decomposition,我正在寻找一种形式的矩阵运算:B=M*a*N其中a是一些一般的平方矩阵,M和N是我想要找到的矩阵。 这样B的列就是A的对角线。第一列是主对角线,第二列是从主对角线偏移1的对角线,依此类推 e、 g.在MATLAB语法中: A = [1, 2, 3 4, 5, 6 7, 8, 9] 及 编辑: 似乎不存在纯线性代数解。因此,我将更准确地说明我试图做的事情: 对于一些大小为1 x m的向量v。然后定义C=repmat(v,m,1)。我的矩阵是A=C-C'。 因此,A基本上是

我正在寻找一种形式的矩阵运算:
B=M*a*N
其中
a
是一些一般的平方矩阵,
M
N
是我想要找到的矩阵。 这样
B
的列就是
A
的对角线。第一列是主对角线,第二列是从主对角线偏移1的对角线,依此类推

e、 g.在MATLAB语法中:

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

编辑: 似乎不存在纯线性代数解。因此,我将更准确地说明我试图做的事情:

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


谢谢

如果你不是在寻找一个线性代数解,那么我会说,使用两个矩阵乘法构造三个与
a
大小相同的额外矩阵在时间和空间复杂度上都是非常低效的。考虑到我有限的线性代数知识,我甚至不确定是否有可能找到一个矩阵解,但即使是这样,也肯定会很混乱

既然你说你只需要沿着一些对角线的值,我就用以下公式来构造这些对角线:

对角线
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

给出。您可以使用函数创建用于重新排列的列索引,然后将其转换为用于重新排列
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

您可以假定
M
N
之间存在什么关系?是
N
=
M
^-1吗?这将简化问题。你有一个方程(
B=M*A*N
)和两个未知数(
M
N
),需要更多信息来解决这个问题!或者您只是想要一个为给定的
a
设置矩阵
B
的函数吗?是的。M和N有自由,但我不知道他们之间有什么关系。变换应该只适用于一般的A,其中有mn个常数矩阵。mn个常数矩阵(不依赖于A值)。在单位矩阵中设置A表明,MN生成一个矩阵,第一列为1,所有其他项为0,因为单位沿主对角线有1,其他项为0。但我看不出这有什么帮助。这是线性代数作业吗?是的,那会有用,但我的想法是使用线性代数解决方案,这样我就不必首先求助于这么大的矩阵。我应该说清楚的。我不确定我是否理解你的建议。如果使用
B=M*A*N
则有4个
mxm
矩阵。使用这种方法,您只有原始矩阵和实际需要的多少条
mx1
对角线。您是正确的,但我要运行此操作的特定矩阵是由长度为m的向量构造的。与m约1e6。我的MATLAB甚至不能用这样的m创建一个零矩阵。我需要在没有矩阵的情况下得到对角线。但这种方法似乎不好,因为我认为一般的代数解不存在。好的,那么我认为我们需要更好地了解矩阵是如何构造的。如果有很多零值,你可以研究稀疏矩阵,但我不知道这是否适用于你的情况。然后B=repmat(v,m,1)。我的矩阵是A=B-B;A基本上是v中所有值的差,但我只对值之间的距离差感兴趣。因此,对角线。我可以用for循环解决这个问题,但是它非常慢。。。这就是为什么我在寻找线性代数的帮助。
k = 1;
diag1 = circshift(v, m-k, 2) - v;

diag1 =

    2    4    4  -10
>> 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