如何使用Io语言中的列表列表来乘以两个矩阵?

时间:2017-09-13 16:29:45

标签: matrix-multiplication nested-lists iolanguage

我正在学习Io语言,想知道如何使用列表列表来组合多个矩阵。

到目前为止,这是我的代码:

mA := List clone
mA := list(list(1, 2, 3), list(4, 5, 6), list(7, 8, 9))
mB := List clone
mB := list(list(1, 2, 3), list(4, 5, 6), list(7, 8, 9))
mC := List clone
mC := list(list(0, 0, 0), list(0, 0, 0), list(0, 0, 0))

i := 0
j := 0
k := 0

for(i, 0, mA size,
    for(j, 0, mB size (at(0)),
        for(k, 0, mB size,
            mC atPut(mC at(i) at(j), mC at(i) at(j) + mA at(i) at(k) * mB at(k) at(j))
        )
    )
)

当我通过它运行此代码时,说“nil不响应'*'”时出错。所以我实际上在嵌套的for循环中成倍增加,它进入列表越界。至少这是我认为它正在做的,因此错误。我不确定还有什么可以改变for循环。我甚至把它们改为2和3,因为那是我试图测试的矩阵列表的大小,但是得到了同样的错误。

1 个答案:

答案 0 :(得分:2)

对于初学者,当索引试图查找不在数组中的位置时会发生此错误。

将其设置为1号,这样您就不会收到“nil”字样。值

另一个问题是输出最终看起来像这样:

list(81,55,list(0,0,0))

我如何修复它是通过使用临时列表,临时总和值和追加方法:

            for(i, 0, mA size-1,
              tempList := List clone
              for(j, 0, mB size (at(0))-1,
                sum := 0
                for(k, 0, mB size-1,
                  sum = sum + mA at(i) at(k) * mB at(k) at(j)
                   )
                   tempList append(sum)
                 )
                 mC atPut(i,tempList)
               )

有了这个,你最终应该把它作为你的矩阵:

列表(列表(30,36,42),列表(66,81,96),列表(102,126,150))