我正在Golang编写一个机器人操作库,我使用了skelterjohn / go.matrix库中的matrix.Product(a * matrix.DenseMatrix,bs ... * matrix.DenseMatrix)形式的函数用于乘法矩阵。可以看出,第一个参数是一个静态参数,在某种意义上说,只有一个参数在那里,第二个参数是一个可变参数,在某种意义上,多个参数可以去那里。所以假设我有6个关节,每个关节对应于我的代码形式struct {matrix,angle}中的结构。我将这6个结构存储在一个数组中,并将它们传递给一个函数,该函数从这个结构数组中提取每个矩阵并将它们放入缓冲通道中。现在,这里是我逻辑分解的地方.... O_O!。如何编写代码,以便提取此通道中的6个矩阵并将其作为参数放在上面的Product函数中? 我尝试执行上述操作的代码如下:
// Struct with a matrix and angle
type TwistnTheta struct {
Tw *gm.DenseMatrix
Th float64
}
// Param : arr - Array of structs
// Param : defConf - Default Orientation struct
func ReqFinalConfig(arr []TwistnTheta, defConf DefaultOrientation) *gm.DenseMatrix {
ch1 := make(chan *gm.DenseMatrix, len(arr))
for i := 0; i < len(arr); i++ {
ch1 <- HomConfig(arr[i].Tw.Array(), &arr[i].Th) //Pushes matrices into channel
//fmt.Println(<-ch1, "\n")
}
// I extract values from the channels manually and pass them into the function....
// I want to automate this argument passing....
return gm.Product(<-ch1 , <-ch1, <-ch1, <-ch1, defConf.ReqDefConfig())
}
编辑:弄清楚逻辑,这就是我做的,
func ReqFinalConfig(arr []TwistnTheta, defConf DefaultOrientation) *gm.DenseMatrix {
ch1 := make(chan *gm.DenseMatrix, len(arr))
//var m1 *gm.DenseMatrix
for i := 0; i < len(arr); i++ {
ch1 <- HomConfig(arr[i].Tw.Array(), &arr[i].Th)
//fmt.Println(HomConfig(arr[i].Tw.Array(), &arr[i].Th), "\n")
}
close(ch1)
return extractChan(ch1,defConf)
}
func extractChan(ch chan *gm.DenseMatrix, defConf DefaultOrientation) *gm.DenseMatrix {
var Ms []*gm.DenseMatrix
ms1 := <-ch
for val := range ch {
Ms = append(Ms,val)
}
for i := 0; i < len(Ms); i++ {
ms1 = gm.Product(ms1, Ms[i])
}
return gm.Product(ms1, defConf.ReqDefConfig())
}