3 回答

TA貢獻(xiàn)1858條經(jīng)驗 獲得超8個贊
例如,
package main
import (
"bytes"
"fmt"
"io/ioutil"
"strconv"
)
func loadMatrix(filename string) ([][]float64, error) {
var m [][]float64
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
rows := bytes.Split(data, []byte{'\n'})
for r := len(rows) - 1; r >= 0; r-- {
if len(rows[r]) != 0 {
break
}
rows = rows[:len(rows)-1]
}
m = make([][]float64, len(rows))
nCols := 0
for r, row := range rows {
cols := bytes.Split(row, []byte{'\t'})
if r == 0 {
nCols = len(cols)
}
m[r] = make([]float64, nCols)
for c, col := range cols {
if c < nCols && len(col) > 0 {
e, err := strconv.ParseFloat(string(col), 64)
if err != nil {
return nil, err
}
m[r][c] = e
}
}
}
return m, nil
}
func main() {
filename := "matrix.tsv"
m, err := loadMatrix(filename)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Matrix:")
fmt.Println(m)
fmt.Println("\nBy [row,column]:")
for r := range m {
for c := range m[0] {
fmt.Printf("[%d,%d] %5v ", r, c, m[r][c])
}
fmt.Println()
}
fmt.Println("\nBy [column,row]:")
for c := range m[0] {
for r := range m {
fmt.Printf("[%d,%d] %5v ", c, r, m[r][c])
}
fmt.Println()
}
}
輸出:
$ cat matrix.tsv
3.14 1.59 2.7 1.8
42
$ go run matrix.go
Matrix:
[[3.14 1.59 2.7 1.8] [42 0 0 0]]
By [row,column]:
[0,0] 3.14 [0,1] 1.59 [0,2] 2.7 [0,3] 1.8
[1,0] 42 [1,1] 0 [1,2] 0 [1,3] 0
By [column,row]:
[0,0] 3.14 [0,1] 42
[1,0] 1.59 [1,1] 0
[2,0] 2.7 [2,1] 0
[3,0] 1.8 [3,1] 0
$

TA貢獻(xiàn)1875條經(jīng)驗 獲得超5個贊
float64Go中的矩陣被聲明為[][]float64
var matrix [][]float64
您可以使用:=運算符來初始化矩陣并自動聲明類型
matrix := [][]float64{}
請注意,上面這行不是簡單的聲明,而是用于創(chuàng)建新的空切片的語法
// creates an empty slice of ints
x := []int{}
// creates a slice of ints
x := []int{1, 2, 3, 4}
的使用[]float64{}結(jié)合了定義和分配。注意下面兩行是不同的
// creates a slice of 4 ints
x := []int{1, 2, 3, 4}
// creates an array of 4 ints
x := [4]int{1, 2, 3, 4}
切片可以調(diào)整大小,數(shù)組具有固定大小。
回到你的問題,這是一個演示如何創(chuàng)建矩陣float64并將新行附加到矩陣的示例。
package main
import "fmt"
func main() {
matrix := [][]float64{}
matrix = append(matrix, []float64{1.0, 2.0, 3.0})
matrix = append(matrix, []float64{1.1, 2.1, 3.1})
fmt.Println(matrix)
}
您可以從此示例開始并更新您的腳本。

TA貢獻(xiàn)1847條經(jīng)驗 獲得超11個贊
我對我的程序做了很少的修改,這是一個“幾乎”的工作示例......不是很優(yōu)雅;)矩陣中仍然存在一個問題:矩陣的第一列對應(yīng)于文件的第一行,所以我不可以訪問列:(
func main() {
matrix := [][]float64{} // matrix corresponding to the text file
// Open the file.
whole_file,_ := ioutil.ReadFile("test2.tsv")
// mesasure the size of the table
tab_whole_file := strings.Split(string(whole_file), "\n")
tab_first_line := strings.Split(tab_whole_file[0], "\t")
nb_col := len(tab_first_line)
nb_lines := len(tab_whole_file) - 1
// I dont know why this number is longer than I expected so I have to substract 1
for i := 0; i < nb_lines ; i++ {
numbers := []float64{} // temp array
line := strings.Split(tab_whole_file[i], "\t")
for j := 1; j < nb_col ; j++ { // 1 instead of 0 because I dont want the first column of row names and I cant store it in a float array
if nb, err := strconv.ParseFloat(line[j], 64); err == nil {
numbers = append(numbers,nb) // not very elegant/efficient temporary array
}
}
matrix = append(matrix, numbers)
}
}
- 3 回答
- 0 關(guān)注
- 168 瀏覽
添加回答
舉報