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