在Golang中乘以2个或更多数组

时间:2016-10-19 06:20:51

标签: matrix multidimensional-array go

也许它不只是一个Go-Problem,但我遇到了这个问题:

我想将两个(或更多)数组相乘,例如:

a := [3]int{2, 3, 5}
b := [2]bool{true, false}
// desired output of "c" => 
// [[2 true] [2 false] [3 true] [3 false] [5 true] [5 false]]

我已经在这里找到了这个库:https://godoc.org/github.com/gonum/matrix/mat64但是我没有看到如何使用除了float64以外的其他东西

后备解决方案将是使用多个范围循环,但如果有一个更平滑的"它将是惊人的。这样做的方法

2 个答案:

答案 0 :(得分:1)

简短回答:go不是针对这类问题的。你想要的是zip函数的等价物,它本身存在于某些语言中(例如Haskell,Python,......)

但是,在Golang中你会遇到一个大问题:你不能拥有动态类型。即:一个数组只能包含一种类型(int OR bool),而不是几种。解决方法是创建一个接口数组,但这意味着你必须制作丑陋的类型断言才能获得正确的类型。

另外,你确实有一般的方法可以做到这一点,但最后得到的类型是[][]interface{},无法知道里面是什么。

对于你的例子:这是做你想要的最简单的方法(不是一般的):

func main() {
    a := [3]int{2, 3, 5}
    b := [2]bool{true, false}
    var c [6][2]interface{}
    i := 0
    for _, val1 := range a {
        for _, val2 := range b {
            c[i] = [2]interface{}{val1, val2}
            i += 1
        }
    }

    var a1 int = c[0][0].(int)
    var b1 bool = c[0][1].(bool)
    fmt.Printf("c[0] is %v, a1 is %d and b1 is %v\n", c[0], a1, b1)
    fmt.Println(c)
}

正如你所看到的,这在实践中是丑陋无用的(并且非常容易出错)

所以,如果你想进行这种转换,你应该使用另一种语言,Go不是(也不会)为此类目的设计的。

答案 1 :(得分:0)

这不是矩阵乘法,如上所述。如果只有两个东西,两个for循环可以工作,但如果有多个东西,它显然会变得乏味。

我这样做的方法是想到一个多维数组。总数"数字"元素是大小的乘积,然后使用像SubFor https://godoc.org/github.com/btracey/meshgrid#SubFor

这样的函数
dims := []int{3,2}
sz := 1
for _,v := range dims {
    sz *= v
}
sub := make([]int, len(dims))
for i := 0: i < sz; i++{
    meshgrid.SubFor(sub, i, dims)
    fmt.Println(a[sub[0]], b[sub[1]])
}

有些东西可以找出类型(附加到切片等),但这应该给你一般的要点。