使用链表来表示矩阵类



我在根据我输入的参数初始化矩阵的链表时遇到了麻烦。所以如果我输入参数(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 = nextrowrow.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":

  1. 您的循环索引。代码for node in range(...)将在每次迭代中从范围中分配一个整数给node

  2. 然后你分配一个新的MatrixNode给node,然后你设置节点的邻居(_right或_down)不是实际的邻居,而是它自己(node._right = node)。

您也永远不会将您在循环中创建的节点保存在任何地方,因此它们将被垃圾收集。

永远不要使用可选参数default

相关内容

  • 没有找到相关文章

最新更新