我想从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中从矩阵中获取对角线?
答案 0 :(得分:3)
如果我理解正确,您希望使用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
答案 1 :(得分:2)
尝试替换此部分:
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
答案 2 :(得分:1)
我不知道为什么你想要一个while循环。如何使用MATLAB的内置diag
函数直接索引每个对角线:
n = size(M,1)
for t = 1:n-1
trend{t} = M(diag(true(n-t,1),t));
end