2016-10-19 8 views
-2

может быть, это не просто Go-проблема, но у меня есть эта проблема:Multiply 2 или более Массивы в Golang

Я хочу, чтобы умножить два (или больше) массивов, так, например:

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.

Резервное решение было бы использовать несколько циклов for-range-loops, но было бы удивительно, более плавный "способ сделать это

ответ

0

Короткий ответ: go не предназначен для такого рода проблем. То, что вы хотите, эквивалентно функции zip, которая присутствует на некоторых языках (например, Haskell, Python, ...)

Однако в Голанге у вас будет одна большая проблема: у вас не может быть динамического типы. То есть: массив может содержать только один тип (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 не был (и не будет) предназначен для таких целей.

+0

Большое спасибо @ t-claverie за ваш ответ. Ваш код-пример - это именно то, что я имел в виду под «множественными петлями для диапазона» ... но дело в том, что может быть еще больше массивов, которые должны быть повторены ... Вы сказали, что самая большая проблема это «два типа в одном массиве» -проблема ... как насчет решения этой части моей проблемы, заменив массив «c» на функцию «c», которая имеет такое же понимание типа: 'func c (a int , b bool) '? –

+0

@uzed_creative Если у вас есть тип и количество ваших массивов, это возможно. Если вы этого не сделаете, вам нужно создать пользовательские функции с помощью типа func f (args interface {} ...) ', который будет выполнять те же утверждения типа, что и выше. –

0

Это не умножение матрицы, как указано выше. Эти два цикла работают, если есть только две вещи, но если их несколько, это может стать утомительным.

Как я могу это сделать, это думать о многомерном массиве. Общее «число» элементов есть произведение размеров, а затем использовать функцию как 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]]) 
} 

Есть некоторые вещи, с типами, чтобы выяснить (добавление в срез, и т.д.), но должен дать вам общий смысл.