在之前的问题中,我找到了一种从sqare矩阵中获取所有对角线的方法。这是我的代码:
diags=[[s[y-x][x] for x in range(n) if 0<=y-x<n] for y in range(2*n-1)]
例如,我有这个矩阵:
m=[[V,A,T],[D,I,S],[O,I,M],[F,U,A]]
这是我想要的输出:
[[V],[D,A],[O,I,T],[F,I,S],[U,M],[A]]
我已经知道如何在正向和反向方向上获得对角线
问题是此代码仅适用于sqare矩阵,但现在我需要在非方阵中找到所有对角线。
我认为问题在于这部分代码:
for y in range(2*n-1)
我的问题是:有没有办法为非方矩阵定义对角线?如果有,有人会帮助我吗?
我发现在其他问题上没有任何可以帮助我的东西
P.S:我不允许使用numpy
任何形式的帮助,提示,建议将不胜感激。
答案 0 :(得分:2)
这是方形矩阵代码的简单推广。而不是2*n-1 = n+n-1
,而是在外部列表中需要m+n-1
,而在内部列表中,您需要检查行和列方向的边界,因为它们将是不同的。
mat = [['V', 'A', 'T'], ['D', 'I', 'S'], ['O', 'I', 'M'], ['F', 'U', 'A']]
rows = len(mat)
cols = len(mat[0])
diags = [[mat[sum_-k][k]
for k in range(sum_ + 1)
if (sum_ - k) < rows and k < cols]
for sum_ in range(rows + cols - 1)]
print(diags)
结果:
[
['V'],
['D', 'A'],
['O', 'I', 'T'],
['F', 'I', 'S'],
['U', 'M'],
['A']
]
答案 1 :(得分:0)
以下代码(在c ++中)将打印对角线:
#include <iostream>
int main() {
char matrix[4][3] = { {'V', 'A', 'T'},
{'D', 'I', 'S'},
{'O', 'I', 'M'},
{'F', 'U', 'A'}};
int m = 4, n = 3;
for (int i = 0; i < m + n - 1; i++) { //m+n-1 = 4+3-1 = 6 diagonals
int z1 = i < n ? 0 : i - n + 1;
int z2 = i < m ? 0 : i - m + 1;
for (int j = i - z2; j >= z1; j--)
std::cout << matrix[j][i - j] << " ";
std::cout << endl;
}
return 0;
}
输出:
V
D A
O I T
F I S
U M
A