

golangを使って、2D array(もしくは２D slice型)の一部を早くコピーする方法を探しています。

先にサンプルコードを書いて、その後詳しく質問させていただきます。

[code]

    package main
    
    import "strconv"
    
    func CreateNewMatrix(Nrow int, Ncol int) [][]int {
        ///create Nrow x Ncol matrix
        tmpImg := make([][]int, Nrow) 
        for i := range tmpImg { 
            tmpImg[i] = make([]int, Ncol) 
        }   
        return tmpImg
    }
    
    func main() {
    
        MaxRowSize := 1000
        MaxColSize := 1000
    
        M := CreateNewMatrix(MaxRowSize, MaxColSize)
    
        for iy:=0; iy<MaxRowSize; iy++  {
            for ix:=0; ix<MaxColSize; ix++ {
                M[iy][ix] = iy+ix
            }
        }
    
        smallM_Size := 25;
        tmp := ""
        smallM := map[int]string{}  //便宜上、mapを使っています。
        idx := 0
        for iy:=0; iy<MaxRowSize; iy += smallM_Size  {
            for ix:=0; ix<MaxColSize; ix += smallM_Size {
                tmp = ""
    
                for sy:=0; sy<smallM_Size; sy++ {
                    for sx:=0; sx<smallM_Size; sx++ {
                        tmp += strconv.Itoa(M[iy+sy][ix+sx])
                        tmp += ":"
                    }
                }
                smallM[idx] = tmp
                idx++
            }
        }
    }
    
[/code]

上記で行っていることは、まず1000x1000の行列（"M"としています）を作成します。  
その次に各エレメントに新規の情報(ここでは、iy+ix)を加えています。  
この行列Mを用いて、その一部から25x25の小さな行列(map型のsmallMとします)の内容をコピーしています。便宜上このコピーしたsmallMの情報は、":"で区切られたstring型で保持しています。

ここでは、smallMを作成するときに、各エレメントづつコピーしていますが、  
より早くコピーする方法があるかどうかを知りたいです。

実際にはこの動作をより大きなサイズの行列Mに対し、より多くのsmallMを作成する必要があります。  
何とかこのプロセスにかかる時間を削減したいと考えています。

少し試したことは、M[iy][1:25]などによる行列へのアクセス方法は知っていますが、  
これをsmallMに直接移すことを試みましたが、どうやらできないようです。

ただ単にコピーがしたいだけですので、早く行う方法・アルゴリズムなどを知っていれば、ご教授をお願いしたいです。

よろしくお願いします。


CC BY-SA 3.0
2015-09-17T22:18:32.247
16728
2015-09-18T00:36:42.347
2015-09-18T00:36:42.347
11048
question
go
golangで2D arrayの一部を素早くコピーする方法


前提条件として以下の様に設定されているとします。

  * 行列 M の行数・列数は smallM のそれの整数倍

その上で、smallM を matrix(2次元スライス)のスライス(3次元スライス)にしてみてはどうでしょうか。以下はそのコードで、`package
main` 〜 `CreateNewMatrix` 関数までは省いてあります。

**copy_matrix.go**

[code]

    func main() {
    
        MaxRowSize := 1000
        MaxColSize := 1000
    
        M := CreateNewMatrix(MaxRowSize, MaxColSize)
    
        for iy := 0; iy < MaxRowSize; iy++ {
            for ix := 0; ix < MaxColSize; ix++ {
                M[iy][ix] = iy + ix
            }
        }
    
        smallM_Size := 25
        ny, nx := MaxRowSize/smallM_Size, MaxColSize/smallM_Size
        smallM := make([][][]int, nx*ny)
        for iy := 0; iy < ny; iy++ {
            for ix := 0; ix < nx; ix++ {
                nth := iy*nx + ix
                smallM[nth] = CreateNewMatrix(smallM_Size, smallM_Size)
                for i := 0; i < smallM_Size; i++ {
                    copy(smallM[nth][i], M[smallM_Size*iy+i][(smallM_Size*ix):(smallM_Size*(ix+1))])
                }
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2015-09-17T23:51:34.097
16730
2015-09-18T00:27:28.910
2015-09-18T00:27:28.910
16728
answer