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

Matrix 在Golang中乘以2个或更多数组,matrix,multidimensional-array,go,Matrix,Multidimensional Array,Go,也许这不仅仅是一个问题,但我有一个问题: 我想将两个(或更多)数组相乘,例如: 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]] 我已经在这里找到了这个库:但我不知道如何使用float64以外的东西 回退解决方案是使用多个for range循环,但如果有一种“更平滑

也许这不仅仅是一个问题,但我有一个问题:

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

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]]
我已经在这里找到了这个库:但我不知道如何使用float64以外的东西


回退解决方案是使用多个for range循环,但如果有一种“更平滑”的方法来实现这一点,那将是令人惊讶的。简短回答:go不适用于此类问题。您需要的是一个与
zip
函数等价的函数,该函数在某些语言(例如Haskell、Python等)中本机存在

然而,在Golang中,您将遇到一个大问题:您不能拥有动态类型。也就是说:数组只能包含一种类型(int或bool),不能包含几种类型。解决方法是创建一个接口数组,但这意味着您必须创建难看的类型断言才能获得正确的类型

另外,您确实有一个通用的方法来实现这一点,但是最后得到的类型将是
[]interface{}
,无法知道其中包含什么

举个例子:下面是做你想做的事情的最简单的方法(不是一般的):

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


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

正如上面所指出的,这不是矩阵乘法。如果只有两件事情,两个for循环就可以工作,但是如果有多件事情,显然会变得单调乏味

我要做的是考虑一个多维数组。元素的总“数量”是大小的乘积,然后使用类似子文件夹的函数

dims:=[]int{3,2}
sz:=1
对于v,v:=范围dims{
sz*=v
}
子:=制造([]整数,长度(dims))
对于i:=0:i

有一些关于类型的问题需要解决(附加到切片等),但这应该给你提供一般要点。

非常感谢@t-claverie的回答。您的代码示例正是我所说的“范围循环的多个”。。。但问题是,可能会有更多的数组需要迭代。。。你说,最大的问题是“一个数组中的两种类型”—问题。。。用一个具有如下类型意识的函数“c”替换数组“c”来解决这部分问题怎么样:
func c(a int,b bool)
?@uzed\u如果你有数组的类型和数量,这是可能的。如果没有,则必须创建类型为
func f(args接口{}…
的自定义函数,该函数将执行与上述相同的类型断言。
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)
}
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]])
}