golangで2D arrayの一部を素早くコピーする方法 – go

質問:


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

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

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++
        }
    }
}

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

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

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

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

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

よろしくお願いします。

質問者: Aki

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

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

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

copy_matrix.go

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))])
            }
        }
    }
}

出典

Related Posts:

Goroutineが途中で止まってしまう。 – go
質問: Twitterのフォローを自動化するためのコードをGo言語で書いています。下記のようなコードを書きましたが、途中までは正常に動きフォローもしていきますが、しばらくすると途中で止まってしまいます。コード中のExceeded Rate Limit.やFinishedが出力されていないので意図した箇所で止まってるのではなく異常が起きて止まっている状況です。しかし、どこで処理が止まっているのかがわかりません。あるときはAdd friendsの後であったり、また、ある時はWaitingの後であったりします。 コード package autofollow import ( "errors" "fmt" "github.com/ChimeraCoder/anaconda" "net/url" ...
Golang GCPにデプロイ後のDatastoreからのエンティティ取得について – go google-app-engine
質問: Goを勉強し始めたばかりの初心者の質問で恐縮ですが、もしご存知の方がいたらご教示いただきたく存じます。 今自分がやりたいことは、GCPのデータストアに格納されているエンティティを取得し、JSON型に成型して返答することです。 ソースが以下になりますが、ローカル環境では、これでエンティティの取得ができ、JSON型に成型されたものが返答されます。 しかし、デプロイ後はGETしようとすると、JSON型の入れ物は作成できますが、中身が空になってしまいます。 初心者のため、至らない点が多いかと思います。もし、足りないソース等ございましたら、追記させていただきます。 宜しくお願い致します。 init.go func init() { http.HandleFunc("/test", GET) } test.go package sample import ( "net/http" "os" ...
画像がグレイスケールかRGBAかを調べたい – go
質問: Goのimageで入力された画像がグレイスケールかRGBAかを判定したいです。どのようにすれば実現できるのでしょうか。image.ColorModel()で判定できるかと考えましたができませんでした。 switch img.ColorModel() { case color.GrayModel: res ...
herokuでfiled to detectエラー – node.js go heroku
質問: 以下のディレクトリ構成のGo+JSアプリをherokuにデプロイしようとしています。 Directory structure |-Godeps |-main.go |-Procfile |-static |-Gruntfile.js |-bower_components |-app |-bower.json |-dist |-package.json Buildpackはnode.jsとGoのものを使用するのでいかのように追加しました。 buildpacks 1. https://github.com/jasonswett/heroku-buildpack-nodejs-grunt-compass 2. https://github.com/heroku/heroku-buildpack-go.git しかし、下記のfailed to detectエラーというエラーで失敗してしまいます。 エラー -----> Multipack app detected -----> Fetching custom git ...
Goの日付変換処理 – go
質問: Goのtime.Time型の日時をフォーマットして元の変数に代入するようにしたのですが、変換されません。 hoge.CreatedAt, err = time.Parse("2006年1月2日15時4分", hoge.CreatedAt.Format("2006年1月2日15時4分")) ここでhoge.CreatedAtを表示しても変換前のままです。 変換前の日付2015-09-01 08:12:00 +0000 UTC なぜ変換されないのでしょうか。 質問者: 野獣先輩 出典
Golangでgo get -u allを実行するとエラーになる – go
質問: Golangのすべてのパッケージをupdateするために、go get -u allを実行すると、directory_name is not using a known version control systemと表示されてしまいます。 packageのupdateも実行されていないようです。 どうすればいいのでしょうか? package cmd/internal/rsc.io/arm/armasm: directory "/usr/local/go/src/cmd/internal/rsc.io/arm/armasm" is not using a known version control system package cmd/internal/rsc.io/x86/x86asm: ...
Go でエラーが出た時StackTraceが見えなくなる – go
質問: GoでGoroutine をたくさん使うプログラミングをしている時エラーが起こった時にGoroutineをすべてStackTraceに表示しようとするので1番肝心な最初のエラー箇所が見えなくなってしまいます。これを防ぐにはどうすればいいのでしょうか。 たくさんとは億単位のGoroutineです。 質問者: 野獣先輩 出典
goroutineでファイルを保存してファイル名を返す。 – go goroutine
質問: ファイルを保存してそのファイル名をチャンネルを使って返すようなプログラムを書いています。 以下のような関数です。 func Download(url string, fnameCh chan string, m *sync.Mutex) 呼び出し側で var m sync.Mutex go Download(url, fnameCh, &m) fname := <- fnameCh のように呼び出します。 urlからデータを取得してそれをファイルに保存します。 ファイル名が重複する可能性があるので保存時にMutexを使ってロックしています。 保存が終わったらfnameChを通してファイル名を返します。 ファイル保存処理の概要は下記のとおりです。 fname := // ロック獲得 m.Lock() // 2番めに呼び出される defer m.Unlock() file, err := os.Create(fname) if ...
Golangのtemplateで配列を余りを均等にして3当分したい。 – go templates
質問: タイトルのような事をしたいです。これをtemplateの計算でやるにはどのようにすればいいでしょうか。=演算子があればif節の中で変数に代入できますが=演算子がないのでどうすれば良いのかわかりません。 {{ define "tiledView" }} {{ $length := len . }} /* 当分する単位を計算 */ {{ $divide := div $length 3}} /* 余りを計算 */ {{ $m := mod $length 3 }} {{ ...
Goのexecでコマンドの途中経過を表示させたい – go shellscript
質問: Goのos/execを使ってコマンドを実行しその途中経過を表示させたいと考え http://qiita.com/hnakamur/items/9701f40c1fec83b1cd1f と https://github.com/hnakamur/execcommandexample を参考にさせていただきました。 しかし、このプログラムで実行しているa.shは以下のようになっていまして #!/bin/sh echo out1 sleep 1 echo err1 1>&2 sleep 2 echo out2 echo out3 sleep 1 echo err2 1>&2 exit 1 出力の間に1秒間のスリープが入っています。スリープがあれば正しく表示されますが、これがないと非決定的な動作をします。 スリープを覗いた状態でも正しく表示させたいのですが、何か方法はありますでしょうか。以下に上記サンプルの実行結果を示します。 sleepあり stdout:out1 stderr:err1 stdout:out2 stdout:out3 stderr:err2 stdout result:out1 out2 out3 stderr result:err1 err2 exitCode:1 sleepなし1 stdout:out1 stdout:out2 stdout:out3 stdout result:out1 out2 out3 stderr result:err1 err2 exitCode:1 sleepなし2 stderr:err1 stdout:out1 stderr:err2 stdout:out2 stdout:out3 stdout result:out1 out2 out3 stderr result:err1 err2 exitCode:1 ...
go言語はさくらやロリポのスタンダードプランでも使える? – go
質問: go言語は最低限の環境でもつかえるので、さくらやロリポのスタンダードプランでも使える? PHPのみでしたが、新しく可能な言語がやっと出たのでしょうか? PYTHONもRUBYもバージョンが古すぎて実質使えないと聞いています。 >>> Goであれば、Linuxが動くという最低限の環境でも動作するポータブルなバイナリが生成されるので、プロビジョニングの手間がほとんどなく、動作も環境にほとんど依存しません。 エックスサーバーでも動いたそうです。http://qiita.com/Lio/items/ee24052e6e2ae0f382d9 ただ新しい言語なので日本語の情報がなく、JSの基礎を学んだ程度ではできないでしょうね。 質問者: temestack mjy ロリポップの共用サーバーでは「C言語などによるバイナリ実行ファイルのCGIの設置」が禁止事項に含まれています。 よって、使えません(技術的には動くはずです)。 さくらのレンタルサーバーでは禁止されてはなさそうですね。 技術的にも可能なはずですが基本仕様に、 共用サーバですので、CPUに著しい負荷をかける処理はご遠慮ください。 もし、サービス運営の支障をきたす過負荷をサーバに与えた場合、予告無く設定解除など処置をしますのでご注意ください。 とある通り、こういった点は注意が必要でしょう。 また、OS は FreeBSD です。 Go言語は、C言語の兄弟言語です。ケントンプソンがGoogleと共に作り上げたコンパイル型のプログラミング言語です。よって、C言語に多少オブジェクト指向の知識があれば簡単に理解出来ます。Go言語はケントンプソンがオブジェクト指向の良いところを取り込んでいる面白いというかオブジェクト指向言語ではないけれど、同等以上の事が可能な今後に期待できる言語です。Udemyに動画講座があります。^^; 特筆すべきは、CGOという仕組みで、ライブラリやフレームワークの不足に対応するため、C 言語の資産をソースレベルで利用できます。つまりミックスドプログラミングが可能です。 出典
WebSocketを使ったウェブアプリでの接続エラー – javascript html jquery
質問: プログラミング初心者です。 現在Go言語を学習しており、「Go言語によるWebアプリケーション開発」という書籍を使っているのですが、その中のWebSocketを使ったチャットアプリ作成にて、下記のエラーが出て解決できずにいます。 room:36 WebSocket connection to 'ws://localhost:8080/room' failed: Error during WebSocket handshake: Unexpected response code: 200 書籍で使われている、GitHubにあがっているコードを使い、接続先のみ変更して試しましたが、同様のエラーとなりました。 下記にコードを載せます。何が問題なのか、ご教示いただけませんでしょうか。 <html> <head> <title>チャット</title> <style> ...
Golangのテンプレートで改行が反映されない。 – html go
質問: Golangのテンプレートを利用して、HTMLを出力しているのですが。 あああ いいい ううう このような内容の文章を出力すると あああ いいい ううう と表示されてしまいます。 https://stackoverflow.com/questions/12671713/golang-how-to-replace-n-with-br/12672021 上の方法を試しましたが あああ <br> いいい <br> ううう <br> となって<br>が表示されてしまいます。 http://m-shige1979.hatenablog.com/entry/2016/01/29/080000 こちらのサイトで紹介されているsafe関数を用いた方法では<br>が評価され、改行されましたが、当然XSSの脆弱性があります。 どのようにすれば改行をHTMLに反映させることができるのでしょうか。 質問者: 野獣先輩 nekketsuuu サンプルとして、次のテキストを p タグの中に入れることを考えます。 const text = `あいう かきく さしす ` 方法1 エスケープした後、改行を <br> に変換するようにすれば良いです。 (Go Playground) const tpl = `<!DOCTYPE html> <html> ...
GAE/Goでデプロイ出来ない – go google-app-engine google-cloud
質問: 発生してる問題 GAE初心者です。GAE/Goでデプロイができません。 ビルドは完了するのですが、serviceのアップデートに時間がかかりすぎてtimeoutになってしまいます。 importするpackageをhttprouterのみにすると成功するので、外部packageの問題だと認識しています。 GAEはsyscall や unsafeパッケージのインポートが許されていないことは調べて分かりました。golang.org/x/sys/unixをインポートしているので、これが原因なのでしょうか?? 以下にて現状をお伝えするので、GAE/Goのよくある問題等、ヒントになる情報が欲しいです。 もし少しでも気になったことがあったらコメントして頂けますでしょうか?? よろしくお願い致します。 ディレクトリ構成 app.yamlはルート配下のappディレクトリに置いてあります。 app.yaml runtime: go env: flex api_version: go1.8 manual_scaling: instances: 1 resources: cpu: 2 memory_gb: 2.3 disk_size_gb: 20 readiness_check: app_start_timeout_sec: 3600 beta_settings: cloud_sql_instances: "インスタンス接続名" エラーメッセージ ERROR: ...
ubuntu 16.04 に mac の I/O Kit(のヘッダファイル) をインストールする方法はあるでしょうか? – macos go ubuntu
質問: u2f USB機器(yubikey) を操作したく、https://github.com/mdp/u2fcli を、 ubuntu 16.04 上で github + circle ci で golang buid (linux, windows, darwin) の golang クロスコンパイルしようとしたのですが、mac(darwin)用コンパイルで、 $ export CGO_ENABLED=1 CC=gcc && gox --osarch "linux/amd64 ...

You Might Also Like

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です