Golang中如何水平连接两个矩阵
Golang中如何水平连接两个矩阵 大家好!我是Go语言的新手。我正在为如何连接两个矩阵而苦恼,例如: mat1:
[[1,2,3],
[4,5,6]]
mat2:
[[7,8,9],
[10,11,12]]
期望得到: mat3:
[[1,2,3,7,8,9],
[4,5,6,10,11,12]]
谷歌上几乎找不到解决方案。我目前进展到这里(也尝试过使用append,但问题是[][]float64类型):
https://play.golang.org/p/8At0utgLgl3
非常感谢任何帮助!
5 回复
我认为你从 append 入手可能是正确的开始。你能分享一下你尝试使用 append 做了什么吗?
更多关于Golang中如何水平连接两个矩阵的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
![表情符号:微笑] 谢谢,哦,细节中藏着秘密 ![表情符号:+1]
感谢您的回复。我认为追加版本的方式存在较大偏差: https://play.golang.org/p/bj1cClEJGDf
它们非常接近;在使用 append 的版本中,唯一需要更改的是将 mat4 设置为 [][]float64,而不是 []float64,然后在遍历 mat1 时,将索引 i 添加到你的 mat4 切片切片中:The Go Playground
在Go语言中水平连接两个矩阵(二维切片)需要确保两个矩阵的行数相同,然后逐行连接。以下是实现方法:
package main
import "fmt"
func main() {
// 原始矩阵
mat1 := [][]int{
{1, 2, 3},
{4, 5, 6},
}
mat2 := [][]int{
{7, 8, 9},
{10, 11, 12},
}
// 水平连接矩阵
mat3 := horizontalConcat(mat1, mat2)
fmt.Println("水平连接结果:")
for _, row := range mat3 {
fmt.Println(row)
}
}
func horizontalConcat(mat1, mat2 [][]int) [][]int {
// 检查矩阵行数是否相同
if len(mat1) != len(mat2) {
panic("矩阵行数不一致")
}
result := make([][]int, len(mat1))
for i := range mat1 {
// 创建新行,长度为两个矩阵对应行的长度之和
newRow := make([]int, len(mat1[i])+len(mat2[i]))
// 复制第一个矩阵的行元素
copy(newRow, mat1[i])
// 复制第二个矩阵的行元素
copy(newRow[len(mat1[i]):], mat2[i])
result[i] = newRow
}
return result
}
输出:
水平连接结果:
[1 2 3 7 8 9]
[4 5 6 10 11 12]
对于[][]float64类型,可以使用泛型实现通用版本:
package main
import "fmt"
func main() {
// float64矩阵
mat1 := [][]float64{
{1.1, 2.2, 3.3},
{4.4, 5.5, 6.6},
}
mat2 := [][]float64{
{7.7, 8.8, 9.9},
{10.1, 11.11, 12.12},
}
// 使用泛型函数
mat3 := horizontalConcatGeneric(mat1, mat2)
fmt.Println("float64矩阵水平连接结果:")
for _, row := range mat3 {
fmt.Println(row)
}
}
// 泛型版本,支持任意数值类型
func horizontalConcatGeneric[T any](mat1, mat2 [][]T) [][]T {
if len(mat1) != len(mat2) {
panic("矩阵行数不一致")
}
result := make([][]T, len(mat1))
for i := range mat1 {
newRow := make([]T, len(mat1[i])+len(mat2[i]))
copy(newRow, mat1[i])
copy(newRow[len(mat1[i]):], mat2[i])
result[i] = newRow
}
return result
}
如果需要在原代码基础上修改,这是修正后的版本:
package main
import "fmt"
func main() {
mat1 := [][]int{{1, 2, 3}, {4, 5, 6}}
mat2 := [][]int{{7, 8, 9}, {10, 11, 12}}
// 检查维度
if len(mat1) != len(mat2) {
fmt.Println("错误:矩阵行数不同")
return
}
// 创建结果矩阵
mat3 := make([][]int, len(mat1))
for i := 0; i < len(mat1); i++ {
// 合并每一行
mat3[i] = append(mat1[i], mat2[i]...)
}
fmt.Println(mat3)
}
这种方法使用append函数并配合...操作符展开切片,代码更简洁。

