我正在寻找一种形式的矩阵运算:B = M*A*N
,其中A
是一些一般的方阵,M
和N
是我想要找到的矩阵。使得B
的列是A
的对角线。第一列主对角线,第二对角从主对角线移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中)。
谢谢!
发布于 2017-01-04 15:58:03
如果你实际上不是在寻找线性代数解,那么我会认为,用两个矩阵乘法构造三个与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.‘;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
的元素来构造这个对角线,而无需构造v
甚至B
。
k = 1;
diag1 = circshift(v, m-k, 2) - v;
diag1 =
2 4 4 -10
主对角线由k = 0
给出,最后对角线由k = m-1
给出。
https://stackoverflow.com/questions/41464274
复制相似问题