我在根据我输入的参数初始化矩阵的链表时遇到了麻烦。所以如果我输入参数(3,3)它实际上应该是4x4这样我就可以使用第一列和第一行进行索引。左上角的节点作为入口点。
def __init__(self, m, n, default=0):
self._head = MatrixNode(None)
for node in range(m - 1):
node = MatrixNode(0)
node._right = node
for node in range(n - 1):
node = MatrixNode(0)
node._down = node
这是我目前看到的,但我肯定它很糟糕。
首先,了解MatrixNode是什么可能是有用的。我猜你只是想在这里存储一个值?
然后我看到两个线性循环,而矩阵是一个n*m的数据结构。你确定你的循环不需要嵌套来正确初始化你的结构吗?
对于链表,我希望有row.next = nextrow
和row.startnode.next = nextnode
这样的东西,我在这里没有看到这样的东西。
说了这些,我想问你,如果你真的想自己实现一个矩阵,并且以这种面向对象的(低效的!)方式。
您可以使用二维数组(a=[[1,2], [3,4]];a[0][0]==1
)或来自numpy/scipy等数字库的良好实现。
有numpy.array
用于存储n维数据(具有像matrix[1,2]
和类似于matlab的语法的好寻址)或numpy.matrix
,这就像一个数组,有一些方法重载矩阵操作(即数组的矩阵-矩阵乘法是逐点的,对于矩阵这是通常的矩阵乘法)。
你是对的,这太可怕了。首先,链表是一种非常糟糕的表示矩阵的方式。如果您想要表示一个矩阵,请从列表的列表开始,如果这还不够,请从列表开始(例如,参见提到numpy的其他答案)
如果你想学习使用链表,选择一个更好的例子。
然后:你在不同的事情上重复使用变量名"node":
-
您的循环索引。代码
for node in range(...)
将在每次迭代中从范围中分配一个整数给node
。 -
然后你分配一个新的MatrixNode给
node
,然后你设置节点的邻居(_right或_down)不是实际的邻居,而是它自己(node._right = node
)。
您也永远不会将您在循环中创建的节点保存在任何地方,因此它们将被垃圾收集。
永远不要使用可选参数default