-
Notifications
You must be signed in to change notification settings - Fork 4
/
cdense_string.go
113 lines (105 loc) · 3 KB
/
cdense_string.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright (c) Harri Rautila, 2012
// This file is part of go.opt/matrix package. It is free software, distributed
// under the terms of GNU Lesser General Public License Version 3, or any later
// version. See the COPYING tile included in this archive.
package matrix
import (
"errors"
"fmt"
"strconv"
"strings"
)
// Convert matrix to row-major string representation.
func (A *ComplexMatrix) String() string {
s := ""
step := A.LeadingIndex()
for i := 0; i < A.Rows(); i++ {
if i > 0 {
s += "\n"
}
s += "["
for j := 0; j < A.Cols(); j++ {
if j > 0 {
s += " "
}
s += fmt.Sprintf("%v", A.elements[j*step+i])
}
s += "]"
}
return s
}
// Parse a matlab-style row-major matrix representation eg [a b c; d e f]
// and return a Matrix. Each element is pair of floats e.g.
// [(1.0+0i) (0.0+0i); (4-2i) (-1-2i)]
func ComplexParse(s string) (A *ComplexMatrix, err error) {
var arrays [][]complex128
start := strings.Index(s, "[")
end := strings.LastIndex(s, "]")
if start == -1 || end == -1 {
err = errors.New("Unrecognized matrix string")
return
}
rowStrings := strings.Split(s[start+1:end], ";")
//nrows := len(rowStrings)
ncols := 0
for _, row := range rowStrings {
rowElems := strings.Split(strings.Trim(row, ") "), ")")
if ncols == 0 {
ncols = len(rowElems)
} else if ncols != len(rowElems) {
err = ErrorDimensionMismatch
return
}
row := []complex128{}
for _, valString := range rowElems {
var cval complex128
valString = strings.Trim(valString, "( ")
cval, err = parseComplex(valString)
if err != nil {
return
}
row = append(row, cval)
}
arrays = append(arrays, row)
}
A = ComplexMatrixFromTable(arrays, RowOrder)
return
}
func parseComplex(s string) (v complex128, err error) {
var re, im string
var rval, ival float64
v = complex(0, 0)
str := strings.Trim(s, " ")
ri := 0
if str[0] == '-' || str[0] == '+' {
ri += 1
}
if n := strings.Index(str[ri:], "+"); n != -1 {
re = strings.Trim(str[:n+ri], " ")
im = strings.Trim(str[n+ri:], " ")
} else if n := strings.Index(str[ri:], "-"); n != -1 {
re = strings.Trim(str[:n+ri], " ")
im = strings.Trim(str[n+ri:], " ")
} else {
err = errors.New("invalid complex number")
return
}
//fmt.Printf("re: '%s', im: '%s'\n", re, im)
if im[len(im)-1] != 'i' {
err = errors.New("invalid complex number, no imaginary part")
return
}
rval, err = strconv.ParseFloat(re, 64)
if err != nil {
return
}
ival, err = strconv.ParseFloat(im[:len(im)-1], 64)
if err != nil {
return
}
v = complex(rval, ival)
return
}
// Local Variables:
// tab-width: 4
// End: