Rでライフゲームを1世代先に進める関数のエラーについて

このQ&Aのポイント
  • Rでライフゲームを1世代先に進める関数を作成しましたが、行列を因数として実行するとエラーが発生しました。
  • エラーメッセージは「replacement(置き換え)の長さが0です」というものです。
  • エラーの原因を教えていただきたいです。
回答を見る
  • ベストアンサー

Rでライフゲームを1世代先に進める関数を作成しました。関数作成時にはエ

Rでライフゲームを1世代先に進める関数を作成しました。関数作成時にはエラーは発生しませんでしたが、因数として行列を与え実行するとエラーが発生しました。エラーの原因を教えて頂けたら嬉しいです。   作成した関数 Life.Game.One.Step <- function(Space) { #因数として行列を読み込む n <- dim(Space) Space.ng <- Space   #次世代の状態を格納する行列を生成 Space.counts <- Space #周囲の生きているセルの数を数え上え、それを格納する行列を生成 Space.counts[1,1] <- Space[1,2]+Space[2,1]+Space[2,2] #4隅の生きているセルの数を数え上げる Space.counts[1,n[2]] <- Space[1,n[2]-1]+Space[2,n[2]-1]+Space[2,n[2]] Space.counts[n[1],1] <- Space[n[1]-1,1]+Space[n[1]-1,2]+Space[n[1],2] Space.counts[n[1],n[2]] <- Space[n[1]-1,n[2]-1]+Space[n[1]-1,n[2]] +Space[n[1],n[2]-1] for( j in c(2:n[2]-1) ) { #4隅を除いた1行目と最終行の周りの生きているセルの数を数え上げる Space.counts[1,j] <- Space[1,j-1]+Space[1,j+1]+Space[2,j-1]+Space[2,j]+Space[2,j+1] Space.counts[n[1],j] <- Space[n[1]-1,j-1]+Space[n[1]-1,j]+Space[n[1]-1,j+1]+Space[n[1],j-1]+Space[n[1],j+1] } for( i in c(2:n[1]-1) ) { #4隅を除いた1列目と最終列の周囲の生きているセルの数を数え上げる Space.counts[i,1] <- Space[i-1,1]+Space[i-1,2]+Space[i,2]+Space[i+1,1]+Space[i+1,2] Space.counts[i,n[2]] <- Space[i-1,n[2]-1]+Space[i-1,n[2]]+Space[i,n[2]-1]+Space[i+1,n[2]-1]+Space[i+1,n[2]] } for ( i in c(2:n[1]-1) ) {  for ( j in c(2:n[2]-1) ) { Space.counts[i,j] <- Space[i-1,j-1]+Space[i-1,j]+Space[i-1,j+1] +Space[i,j-1]+Space[i,j+1] +Space[i+1,j-1]+Space[i+1,j]+Space[i+1,j+1] } } for ( i in c(1:n[1]) ) {  #Space.count[i,j]の値に応じて for( j in c(1:n[2]) ) { #Space.ng[i,j]に次世代の状態を代入していく if (Space.count[i,j]<2) { Space.ng[i,j] <- 0 } else if(Space.count[i,j]==3) { Space.ng[i,j] <- 1 } else if(Space.count[i,j]>3) { Space.ng[i,j] <- 0 } } } return(Space.ng)  #返り値として1世代先の行列を返す } 関数に行列を因数として実行すると以下のようなエラーメッセジーが生成されました。 > Life.Game.One.Step(Life.Space.A) 以下にエラー Space.counts[1, j] <- Space[1, j - 1] + Space[1, j + 1] + Space[2, : replacement(置き換え)の長さが0です

質問者が選んだベストアンサー

  • ベストアンサー
  • ur2c
  • ベストアンサー率63% (264/416)
回答No.1

debug で追ってみましたか? 使い方は ?debug で出ます。

multisharpener
質問者

お礼

回答ありがとうございます。なんとか解決できました。どうやら単純に( )をつけ忘れていたようでした。

関連するQ&A

  • Excel VBAライフゲーム

    ExcelのVBAでライフゲームを作りたいのですが、次のプログラムの途中以降がわかりません。 もしよろしければ、このつづきの簡単な実行できるVBAライフゲームを教えてください。 続きのプログラムを教えていただけたら幸いです。 Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const SIZE As Integer = 19 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim N As Integer Dim Cnext(SIZE, SIZE) As Integer Dim I As Integer, J As Integer InitRate = -1 Do While InitRate < 0 Or 1 < InitRate Loop For I = 0 To SIZE For J = 0 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 0 To SIZE For J = 0 To SIZE If C(I, J) = ALIVE Then Cells(I + 1, J + 1).Value = "■" Else Cells(I + 1, J + 1).Vallue = "" End If Next J Next I For I = 0 To SIZE For J = 0 To SIZE N = Count(I, J) Next J Next I For I = 0 To SIZE For J = 0 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Count(I As Integer, J As Integer) As Integer End Function

  • 【JAVA】数字をひし形に出力するプログラムについ

    JAVAについて質問です。 import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int count = 1, space = 0; for (int i = 1; i < 2 * n; i++) { if (i <= n) { space++; } else { space--; } for (int spc = n - space; spc > 0; spc--) { System.out.print(" "); } for (int j = 0; j < count; j++) { System.out.print(i); } if (i < n) { count = count + 2; } else { count = count - 2; } System.out.println(); } in.close(); } } ↑のプログラムで標準入力に例えば8と入力すると、 _______1↵ ______222↵ _____33333↵ ____4444444↵ ___555555555↵ __66666666666↵ _7777777777777↵ 888888888888888↵ _9999999999999↵ __1010101010101010101010↵ ___111111111111111111↵ ____12121212121212↵ _____1313131313↵ ______141414↵ _______ 15↵ という風なひし形が出力されます。 「_」は実際には出力されません。 これを _______1↵ ______222↵ _____33333↵ ____4444444↵ ___555555555↵ __66666666666↵ _7777777777777↵ 888888888888888↵ _9999999999999↵ __00000000000↵ ___111111111↵ ____2222222↵ _____33333↵ ______444↵ _______5↵ という風にしたいです。 (上から10段目以降は1の位が出力されるようにしたいのです) それにはこのプログラムをどう修正すればよいでしょうか?

    • ベストアンサー
    • Java
  • 行列の積について

    3行3列の行列AとB、およびその和と積を表示するものです #include <stdio.h> int main (void) { int i,j,k; double a[3][3] = {{2.4, 5.5, -8.5},{0.8, 3.7, 1.1},{3.5, -9.1, 2.6}}; double b[3][3] = {{-5.1, 9.8, 2.3},{-4.1, 0.2, -0.3},{3.3, 6.1, -1.3}}; double c[3][3] = {0}; printf(" 行列A\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) printf("%5.1f", a[i][j]); printf("\n"); } printf("\n 行列B\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) printf("%5.1f", b[i][j]); printf("\n"); } printf("\n 行列A+B\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) c[i][j] = a[i][j] + b[i][j]; } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%5.1f", c[i][j]); printf("\n"); } for (i=0; i<3 ; i++){ for (j=0; j<3; j++) for (k=0; k<3; k++) c[i][j] =c[i][j]+ a[i][k]* b[k][j]; } printf("\n 行列AB\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%7.2f", c[i][j]); printf("\n"); } return 0; } これだと積だけが異なった値が出てしまいます。 試しに、積の部分だけで組んでみると正しい答えが出ました。 for文のブロックの組み方がまずいのかなと思っていますが、これ以外だと、行列のレイアウトが崩れてしまいます どのように直したらいいのか、ご教示お願いします

  • 行列の計算

    #include<stdio.h> #define N 2 #define M 3 void hyoji(float[][M]); int main(){ int i,j,k; float a[N][M] = {{2.0,2.0,2.0},{2.0,2.0,2.0}}; float b[M][M] = {{1.0,1.0,1.0},{2.0,2.0,2.0},{1.0,1.0,1.0}}; float c[N][N]; for(i=0; i<N; i++){ for(j=0; j<M; j++){ c[i][j] = 0; for(k=0; k<M; k++){ c[i][j] += a[i][k] * b[k][j]; } } } hyoji(c); return(0); } void hyoji(float x[][M]){ int i,j; for(i=0; i<N; i++){ for(j=0; j<M; j++){ printf("%4.1f ",x[i][j]); } printf("\n"); } } 以上のプログラムで 行列aと行列bをかけ合せた行列cを求めるのですが コンパイルすると 8 8 8 8 8 1 となり、正しい結果がでません。 なにが間違っているのでしょうか?? よろしくお願いします。

  • C言語のscanf関数についての質問です。

    閲覧ありがとうございます。 C言語についての質問です。 nと、2つのn×n行列の各成分をキーボードから入力し、 その和を計算するプログラムを作ろうとして i,j,と行列二つの配列(a[n][n]とb[n][n])をintで定義した後、 printf("行列aの成分を入力してください。\n"); for(i=0; i<=n-1; n++) {for(j=0; j<=n-1; j++) { scanf("%d",&a[i][j]); } } printf("行列bの成分を入力してください。\n"); for(i=0; i<=n-1; n++) {for(j=0; j<=n-1; j++) { scanf("%d",&b[i][j]); } } というプログラムを書いてn=3としたのですが、 「行列aの成分を入力してください」と表示されて 例えば「1 2 3 4 5 6 7 8 9」と入力してEnterキーを押しても 「行列bの成分を入力してください」という文が表示されません。 C言語を学び始めてまもないので、 まだ基本的なところが理解できていないかもしれません。 何が原因だかわかる方、解答頂けると嬉しいです。

  • doubleからfloatにすると表示が変になる

    しょうもない質問ですいません。 下記のC言語の行列積のコードでは行列の変数をdoubleとしていますが、これをfloatに全て置き換えると、printfで表示させる結果がバグってしまいます。 原因は何でしょうか? 最近ひさしぶりにC言語を触ったので、しょうもないところでつまずきました。 お願いします。 ----------------------------------------- #include <stdio.h> #include <stdlib.h> #define N 10 //N次の正方行列まで扱えるようにする void matrixmultiply(int n,double a[N][N],double b[N][N],double c[N][N]); int main(int argc, char** argv) { int i,j,n; double A[N][N],B[N][N],C[N][N]; FILE *readin1,*readin2; /*行列の値が書き込まれたファイルを開く*/ if((readin1=fopen("a.dat","r"))==NULL) { printf("a.datを開けません\n"); exit(1); } if((readin2=fopen("b.dat","r"))==NULL) { printf("b.datを開けません\n"); exit(1); } printf("行列の次数を入力してください\n"); scanf("%d",&n); printf("%d次の正方行列の掛け算を行います\n\n",n); /*ファイルから数値を読み込み、配列に代入する*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { fscanf(readin1,"%lf",&A[i][j]); fscanf(readin2,"%lf",&B[i][j]); } } matrixmultiply(n,A,B,C); //関数を呼び出し行列の掛け算を行う。 /*結果を表示する*/ printf("計算結果\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%lf ",C[i][j]); } printf("\n"); } fclose(readin1); fclose(readin2); return 0; } /*掛け算を行う行列2つと、結果を入れる行列を引数として受け取る。*/ void matrixmultiply(int n,double a[N][N],double b[N][N],double c[N][N]) { int i,j,k; /*受け取った2つの行列の掛け算を行う。*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n;k++) { c[i][j]+=a[i][k]*b[k][j]; } } } }

  • スレッドについて質問があります。

    こんばんは。 今、「スレッドを使った並列計算」というテーマを考えています。 並列処理が可能である行列の計算を、スレッドを用いて処理してみる、といったことをやっているんですが、スレッドの使い方がいまいちわかりません。 プログラムなんですが、はじめに、n行n列の配列を定義します(nは自分で入力)。 double A[][] = new double [n][n]; double B[][] = new double [n][n]; double C[][] = new double [n][n]; その後、A行列、B行列として使う配列に数値を代入します(A行列には1~n^2、B行列には(n^2)+1~(n^2)*2までの数値が代入されるようになっています)。 そして、次の計算を行なうわけですが・・・ for (i = 0; i < n; i++){ for (j = 0; j < n; j++){ C[i][j]=0; for (k = 0; k < n; k++){ C[i][j] += A[i][k] * B[k][j]; } } } この計算をどうスレッドに対応させればいいのか、わからなくてずっと悩んでいます。 ぜひみなさんの意見、アドバイスを聞かせてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • マクロの行列の掛け算ができません

    エクセルでマクロ勉強中の初心者です。 マクロで行列A(3行4列)、行列B(4行2列)の掛け算のプログラム(下記)を作っているのですが 「インデックスが有効範囲にありません」というエラーメッセージが出てしまいます。 エクセルで関数(MMULT)で同様の計算をするときちんと計算できるのですが・・・。 どなたか教えてください。 よろしくお願いいたします。 Sub s1() ' 次元の設定 Dim A(3, 4), B(4, 2), C(3, 2) N1 = 3: N2 = 4: N3 = 3 ' データの入力 (行列AとBの設定) For I = 1 To N1: For J = 1 To N2 A(I, J) = Worksheets("s1").Cells(I, J) Next J: Next I For I = 1 To N2: For J = 1 To N3 B(I, J) = Worksheets("s1").Cells(I, J + 5) Next J: Next I ' ベクトルの内積 For I = 1 To N1 For J = 1 To N3 For K = 1 To N2 C(I, J) = C(I, J) + A(I, K) * B(K, J) Next K Next J Next I ' 結果の出力 For I = 1 To N1 For J = 1 To N3 Worksheets("s1").Cells(I + 6, J + 7) = C(I, J) Next J Next I End Sub

  • 行列積の問題で

    行列積の問題で1000×1000の問題を解きたいと思っています。 100×100ならできるのですが、1000×1000にするとセグメンテーションエラーになってしまいます。 一部引用すると・・・ #define N 1000 size=N unsigned long int a[N][N],b[N][N]; unsigned long int c[N][N]; for(i=0; i<size; i++){ for(j=0; j<size; j++){ c[i][j] = 0; for(k=0; k<size; k++){ c[i][j] = c[i][j] + a[i][k]*b[k][j]; } こんな感じです。 初歩的な質問だと思いますがお願いします

  • ループ処理でシンプルにまとめる方法を教えてください。

    (例) for ($j=0;$j<=count($arGroup)-1;$j++){ for ($i=0;$i<=count($arGroup[$j])-1;$i++){ if($j == 0){ echo "(".$number[0][$i+(count($ar)-1)].")\n"; }elseif($j == 1){ echo "(".$number[0][$i+(count($ar)-1)+(count($arGroup1))].")\n"; }elseif($j == 2){ echo "(".$number[0][$i+(count($ar)-1)+(count($arGroup1))+(count($arGroup2))].")\n"; }elseif($j == 3){ echo "(".$number[0][$i+(count($ar)-1)+(count($arGroup1))+(count($arGroup2))+(count($arGroup3))].")\n"; } } } このループ処理をもっとシンプルにしていきたいと思います。 jの数が増えていく予定)+(count($arGroup数字))が追加されていくような形になります。 どなたか教えてください。

    • ベストアンサー
    • PHP