将矩阵对角线转换为列
Turning matrix diagonals to columns
我正在寻找以下形式的矩阵运算: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]
编辑:
似乎不存在纯线性代数解决方案。所以我会更准确地说明我正在尝试做什么:
对于大小为 1 x m
的向量 v
。然后定义C = repmat(v,m,1)
。我的矩阵是 A = C-C.';
。
因此,A
本质上是 v
中值的所有差异,但我只对值之间的某个距离的差异感兴趣。
这些是 A
的对角线;但是 m
太大以至于构造这样的 m x m
矩阵会导致内存不足的问题。
我正在寻找一种尽可能高效地提取这些对角线的方法(在 MATLAB 中)。
谢谢!
如果您实际上不是在寻找线性代数解决方案,那么我认为使用两次矩阵乘法构造三个与 A
大小相同的额外矩阵在时间和 [=49 方面都非常低效=] 复杂性。鉴于我对线性代数的了解有限,我不确定是否有可能找到矩阵解决方案,但即使找到它也肯定会很混乱。
既然你说你只需要沿着一些对角线的值,我会只使用 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
Diagonal 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
来自评论:
For v some vector of size 1xm. Then B=repmat(v,m,1). My matrix is A=B-B.'; A is essentially all differences of values in v but I'm only interested in the difference up to some distance between values.
假设
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
to create column indices for the reshuffling, then convert those to a 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
。
我正在寻找以下形式的矩阵运算: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]
编辑: 似乎不存在纯线性代数解决方案。所以我会更准确地说明我正在尝试做什么:
对于大小为 1 x m
的向量 v
。然后定义C = repmat(v,m,1)
。我的矩阵是 A = C-C.';
。
因此,A
本质上是 v
中值的所有差异,但我只对值之间的某个距离的差异感兴趣。
这些是 A
的对角线;但是 m
太大以至于构造这样的 m x m
矩阵会导致内存不足的问题。
我正在寻找一种尽可能高效地提取这些对角线的方法(在 MATLAB 中)。
谢谢!
如果您实际上不是在寻找线性代数解决方案,那么我认为使用两次矩阵乘法构造三个与 A
大小相同的额外矩阵在时间和 [=49 方面都非常低效=] 复杂性。鉴于我对线性代数的了解有限,我不确定是否有可能找到矩阵解决方案,但即使找到它也肯定会很混乱。
既然你说你只需要沿着一些对角线的值,我会只使用 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
Diagonal 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
来自评论:
For v some vector of size 1xm. Then B=repmat(v,m,1). My matrix is A=B-B.'; A is essentially all differences of values in v but I'm only interested in the difference up to some distance between values.
假设
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
to create column indices for the reshuffling, then convert those to a 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
。