2011-01-18 67 views
29
func identityMat4() [16]float { 
    return { 
     1, 0, 0, 0, 
     0, 1, 0, 0, 
     0, 0, 1, 0, 
     0, 0, 0, 1 } 
} 

Tôi hy vọng bạn có ý tưởng về những gì tôi đang cố gắng làm từ ví dụ. Làm thế nào để làm điều này là Go?Khởi tạo mảng

+0

Tại sao là ma trận của bạn một mảng một chiều? Đi hỗ trợ mảng đa chiều/lát - sẽ không phải là một phù hợp hơn cho vấn đề? (http://golang.org/ref/spec#Array_types) –

Trả lời

32
func identityMat4() [16]float64 { 
    return [...]float64{ 
     1, 0, 0, 0, 
     0, 1, 0, 0, 
     0, 0, 1, 0, 
     0, 0, 0, 1 } 
} 

(Click to play)

+0

Bạn không trả về ma trận nhận dạng. – peterSO

+0

^cố định để dễ đọc và chính xác –

+0

bạn cũng có thể viết ** trả lại [16] float64 ** –

3

Nếu bạn đang viết chương trình của bạn sử dụng thành ngữ Go, bạn sẽ được sử dụng lát. Ví dụ,

package main 

import "fmt" 

func Identity(n int) []float { 
    m := make([]float, n*n) 
    for i := 0; i < n; i++ { 
     for j := 0; j < n; j++ { 
      if i == j { 
       m[i*n+j] = 1.0 
      } 
     } 
    } 
    return m 
} 

func main() { 
    fmt.Println(Identity(4)) 
} 

Output: [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1] 
+4

Xem http://blog.golang.org/2011/01/go-slices-usage-and-internals.html cho sự khác biệt giữa mảng và lát. –

+3

Blog Go chính thức bây giờ chỉ ra các ma trận chuyển đổi là một trong số ít các trường hợp sử dụng tốt để sử dụng mảng trực tiếp: "Mảng có vị trí của chúng - chúng là đại diện tốt cho ma trận chuyển đổi chẳng hạn - nhưng mục đích phổ biến nhất của chúng trong Go là giữ bộ nhớ cho một lát. " – tbone

12
s := []int{5, 2, 6, 3, 1, 4} // unsorted 
sort.Ints(s) 
fmt.Println(s) 
+12

Làm thế nào là có liên quan ở tất cả? – OneOfOne

0

Làm thế nào để sử dụng một initializer mảng để khởi tạo một khối bảng thử nghiệm:

tables := []struct { 
    input []string 
    result string 
} { 
    {[]string{"one ", " two", " three "}, "onetwothree"}, 
    {[]string{" three", "four ", " five "}, "threefourfive"}, 
} 

for _, table := range tables { 
    result := StrTrimConcat(table.input...) 

    if result != table.result { 
     t.Errorf("Result was incorrect. Expected: %v. Got: %v. Input: %v.", table.result, result, table.input) 
    } 
} 
Các vấn đề liên quan