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函数并配合...操作符展开切片,代码更简洁。

回到顶部