在 Matlab 中获取矩阵的对角线?
To Get Diagonals of a Matrix in Matlab?
我想从 Matlab 中的矩阵中获取对角线。
例如,给定以下矩阵
M = [1 1 4 5 4
2 5 1 2 2
4 1 2 1 3
1 3 1 1 1
1 2 3 3 1]
我想得到构成上对角线的向量列表:
{[1 1 1 1], [4 2 3], [5 2] [4]}
。
一次尝试
我想用 Matlab 中的 while 循环替换 if 子句
if (i==j)
A(t+1,i) = M(i,j)
end
if (i==j+1)
A(t+1,i) = M(i,j)
end
...
if (i==j+N)
A(t+1,i) = M(i,j)
end
存储矩阵的所有对角线
t = 0;
while (t < 5) % if-clauses replaced here by this
for i=1:5
for j=i:5
if (i == j+t)
trend(t+1,i) = M(i,j);
end
end
end
t = t + 1;
end
想法是将元素存储到矩阵 trend
中,条件 i == j+t
我发现该条件适用于上三角形的对角线。
if 子句被错误的伪代码取代,它试图通过矩阵的上三角,但是错误的是因为在 trend
中没有找到“1”向量
如何从 Matlab 中的矩阵中获取对角线?
尝试替换这部分:
if (i==j)
A(t+1,i) = M(i,j)
end
if (i==j+1)
A(t+1,i) = M(i,j)
end
...
if (i==j+N)
A(t+1,i) = M(i,j)
end
与:
if (i>=j && i<=j+N)
A(t+1,i) = M(i,j)
end
我不知道你为什么要 while 循环。使用 MATLAB 的内置 diag
函数直接索引每条对角线怎么样:
n = size(M,1)
for t = 1:n-1
trend{t} = M(diag(true(n-t,1),t));
end
如果我没理解错的话,您想使用 spdiags
函数来提取上部非对角线。示例:
N = 5;
M = magic(N)
D = spdiags(M, 1:N-1)
DD = arrayfun(@(i) D(i+1:end,i).', 1:N-1, 'Uniform',false)
celldisp(DD)
结果:
M =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
D =
0 0 0 0
24 0 0 0
7 1 0 0
20 14 8 0
3 22 16 15
DD =
[1x4 double] [1x3 double] [1x2 double] [15]
DD{1} =
24 7 20 3
DD{2} =
1 14 22
DD{3} =
8 16
DD{4} =
15
我想从 Matlab 中的矩阵中获取对角线。 例如,给定以下矩阵
M = [1 1 4 5 4
2 5 1 2 2
4 1 2 1 3
1 3 1 1 1
1 2 3 3 1]
我想得到构成上对角线的向量列表:
{[1 1 1 1], [4 2 3], [5 2] [4]}
。
一次尝试
我想用 Matlab 中的 while 循环替换 if 子句
if (i==j)
A(t+1,i) = M(i,j)
end
if (i==j+1)
A(t+1,i) = M(i,j)
end
...
if (i==j+N)
A(t+1,i) = M(i,j)
end
存储矩阵的所有对角线
t = 0;
while (t < 5) % if-clauses replaced here by this
for i=1:5
for j=i:5
if (i == j+t)
trend(t+1,i) = M(i,j);
end
end
end
t = t + 1;
end
想法是将元素存储到矩阵 trend
中,条件 i == j+t
我发现该条件适用于上三角形的对角线。
if 子句被错误的伪代码取代,它试图通过矩阵的上三角,但是错误的是因为在 trend
如何从 Matlab 中的矩阵中获取对角线?
尝试替换这部分:
if (i==j)
A(t+1,i) = M(i,j)
end
if (i==j+1)
A(t+1,i) = M(i,j)
end
...
if (i==j+N)
A(t+1,i) = M(i,j)
end
与:
if (i>=j && i<=j+N)
A(t+1,i) = M(i,j)
end
我不知道你为什么要 while 循环。使用 MATLAB 的内置 diag
函数直接索引每条对角线怎么样:
n = size(M,1)
for t = 1:n-1
trend{t} = M(diag(true(n-t,1),t));
end
如果我没理解错的话,您想使用 spdiags
函数来提取上部非对角线。示例:
N = 5;
M = magic(N)
D = spdiags(M, 1:N-1)
DD = arrayfun(@(i) D(i+1:end,i).', 1:N-1, 'Uniform',false)
celldisp(DD)
结果:
M =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
D =
0 0 0 0
24 0 0 0
7 1 0 0
20 14 8 0
3 22 16 15
DD =
[1x4 double] [1x3 double] [1x2 double] [15]
DD{1} =
24 7 20 3
DD{2} =
1 14 22
DD{3} =
8 16
DD{4} =
15