创建一个可以初始化的Matrix类,而不首先声明矩阵大小

时间:2013-04-06 14:33:30

标签: matrix initialization smalltalk squeak

我是Smalltalk的新手,目前正在上课。我们被分配的问题之一需要创建一个新的类“HeavyMatrix”,就像这样 -

aMatrix := HeavyMatrix new.

请注意,没有初始大小分配。尺寸应该在创造时不确定。然后,该类使用以下方法将值添加到矩阵 -

aMatrix setRow:1 column:2 value:7.

矩阵中未以这种方式声明的所有值都默认为0.新的Class HeavyMatrix不应该除了Object之外的其他任何子类(即不是Matrix或Array)。任何Smalltalkers可以帮助我吗?该类必须包含一些其他方法,但我认为一旦我能够初始化类,我就能算出其他所有方法。谢谢!

1 个答案:

答案 0 :(得分:4)

我可以建议您...首先,如果当前列大小小于所需要的,则可以使用有序集合和setRow:column:value:内部,而不是添加缺少OrderedCollection实例的内容。与所需的行大小相同(添加0)。实现将是这样的:

initialize
    rows := OrderedCollection new

setRow: aRow column: aColumn value: aValue
    | row |
    rows size < aRow ifTrue: [
        (aRow - rows size) timesRepeat: [rows add: OrderedCollection new]].
    row := rows at: aRow.
    row size < aColumn ifTrue: [
        (aColumn - row size) timesRepeat: [row add: 0]].
    row at: aColumn put: aValue

getRow: aRow column: aColumn
    aRow <= rows size ifTrue: [
        |row|
        row := rows at: aRow.
        aColumn <= rows size ifTrue: [^ row at: aColumn]].
    ^ 0 

但更有效的方法是实现我认为的稀疏矩阵。你在wiki描述了很多结构。请注意,只有当元素数量少于矩阵本身的大小时,此矩阵才有效。但是,如果您检查最简单的实现,比如在字典中存储coords-value数据,那么它将为您提供很多帮助:

initialize
    dict := Dictionary new

setRow: aRow column: aColumn value: aValue
    dict at: aRow@aColumn put: aValue

getRow: aRow column: aColumn
    dict at: aRow@aColumn ifAbsent: [0]