• Save
Ohp Seijoen H20 05 Hairetsu
Upcoming SlideShare
Loading in...5
×
 

Ohp Seijoen H20 05 Hairetsu

on

  • 1,316 views

 

Statistics

Views

Total Views
1,316
Views on SlideShare
1,316
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Ohp Seijoen H20 05 Hairetsu Ohp Seijoen H20 05 Hairetsu Presentation Transcript

  • データ解析の基礎 配列 2008年8月,データ解析の基礎,加藤,瀬々,金子. 1
  • 目標 • 配列を理解する – 配列は多数のデータを表すのに便利 – データ群から統計量を求めよう – 配列に一気に数値を代入する方法 – メソッドに配列を渡すには • 2次元配列を理解する 2008年8月,データ解析の基礎,加藤,瀬々,金子. 2
  • べき乗の合計のプログラムをもっと汎用的に Test07a.java public class Test07a { public static void main( String[] args ){ int a, b, c, d, e, f, n; int pow_a, pow_b, pow_c, pow_d, pow_e, pow_f; int sum; n = 3; a = 3; b = 7; c = 4; d = 5; e = 9; f = 1; } sum = pow_a+pow_b+pow_c+pow_d+pow_e+pow_f; System.out.println(“sum=“+sum); } pow_a = power(a,n); pow_b = power(b,n); pow_c = power(c,n); pow_d = power(d,n); pow_e = power(e,n); pow_f = power(f,n); どこかで 書き間違えそう public static int power( int x, int n ){ int i, ret; データ数を ret = 1; for ( i = 0; i < n; i++ ){ 10000個もあったら ret = ret * x; どうする? } return ret; } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 3
  • 配列を使って汎用的に べき乗の合計を求める int[] 型 public class Test07b { int 配列を参照する型. public static void main( String[] args ){ int[] a; 配列は複数の値を int[] pow_a; int i, n, sum; 格納できる. n = 3; 長さ6の配列を生成 番号でアクセスできる a = new int[6]; a[0]=3; a[1]=7; a[2]=4; a[3]=5; a[4]=9; a[5]=1; pow_a = new int[a.length]; a for ( i = 0; i < a.length; i++ ){ pow_a[i] = power(a[i],n); } [0]=3 [1]=7 [2]=4 [3]=5 [4]=9 [5]=1 sum = 0; for ( i = 0; i < pow_a.length; i++ ){ 添え字は0から始まる sum = sum + pow_a[i]; } System.out.println(“sum=“+sum); } a.length } public static int power( int x, int n ){略} a が参照している配列の 長さ 2008年8月,データ解析の基礎,加藤,瀬々,金子. 4
  • どのように計算されているのか べき乗の合計を求める public class Test07b { public static void main( String[] args ){ int[] a; int[] pow_a; int i, n, sum; n = 3; a = new int[6]; 長さ6の配列を生成 a[0]=3; a[1]=7; a[2]=4; a[3]=5; a[4]=9; a[5]=1; pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 for ( i = 0; i < pow_a.length; i++ ){ } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } 合計の 計算 最初 sum に 0 を入れて 一つずつ加えていっている } public static int power( int x, int n ){略} } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 5
  • どのように計算されているのか Test07b.java べき乗の合計を求める public class Test07b { public static void main( String[] args ){ int[] a; int[] pow_a; int i, n, sum; n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 for ( i = 0; i < pow_a.length; i++ ){ } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } 合計の 計算 最初 sum に 0 を入れて 一つずつ加えていっている } public static int power( int x, int n ){略} } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 6
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i n n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} } 正確には,様々なメモリ領域があり,また,スタックをヒープ領域に割り当 2008年8月,データ解析の基礎,加藤,瀬々,金子. 7 ててもよいことになっているが,ここでは簡単化のため,スタック以外のメ モリ領域をすべてヒープと呼ぶことにする
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 8
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } 配列の実体はヒープ上に確保され, public static int power( int x, int n ){略} [0]=0 [1]=0 [2]=0 } 変数a自体は実体のある 場所(アドレス)だけ保持している. 2008年8月,データ解析の基礎,加藤,瀬々,金子. 9
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=0 [2]=0 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 10
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=0 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 11
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 12
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=0 [1]=0 [2]=0 2008年8月,データ解析の基礎,加藤,瀬々,金子. 13
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=0 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=0 [1]=0 [2]=0 2008年8月,データ解析の基礎,加藤,瀬々,金子. 14
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=0 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=0 [2]=0 2008年8月,データ解析の基礎,加藤,瀬々,金子. 15
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=1 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=0 [2]=0 2008年8月,データ解析の基礎,加藤,瀬々,金子. 16
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=1 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=0 [2]=0 2008年8月,データ解析の基礎,加藤,瀬々,金子. 17
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=1 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=0 2008年8月,データ解析の基礎,加藤,瀬々,金子. 18
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=2 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=0 2008年8月,データ解析の基礎,加藤,瀬々,金子. 19
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=2 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=0 2008年8月,データ解析の基礎,加藤,瀬々,金子. 20
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=2 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 21
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=3 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 22
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=3 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 23
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=3 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 24
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=3 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=0 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 25
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=0 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=0 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 26
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=0 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=27 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 27
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=1 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=27 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 28
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=1 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=27 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 29
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=1 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=370 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 30
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=2 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=370 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 31
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=2 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=370 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=9 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 32
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=2 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=434 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 33
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=3 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=434 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=27 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 34
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=3 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=434 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=9 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 35
  • どのように計算されているのか Test07b.java べき乗の合計を求める スタック メモリの一部 public class Test07b { main のスタックフレーム public static void main( String[] args ){ int[] a; a pow_a int[] pow_a; int i, n, sum; i=3 n=3 n = 3; a = new int[3]; 長さ3の配列を生成 a[0]=3; a[1]=7; a[2]=4; sum=434 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; } べき乗の 計算 } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } for ( i = 0; i < pow_a.length; i++ ){ 合計の 計算 ヒープ メモリの一部 } public static int power( int x, int n ){略} [0]=3 [1]=7 [2]=4 } [0]=9 [1]=343 [2]=64 2008年8月,データ解析の基礎,加藤,瀬々,金子. 36
  • 練習7-b. Test07b.java プロジェクト名: test07 public class Test07b { public static void main( String[] args ){ デバッガを使って int[] a; (1) pow_a および sum が int[] pow_a; int i, n, sum; 計算されていく様子を n = 3; a = new int[3]; 長さ3の配列を生成 確認せよ a[0]=3; a[1]=7; a[2]=4; (2) 変数 n の値を 2 などに 変更しても正しく計算 pow_a = new int[a.length]; for ( i = 0; i < a.length; i++ ){ } pow_a[i] = power(a[i],n); sum = 0; べき乗の 計算} されることを確認せよ for ( i = 0; i < pow_a.length; i++ ){ } sum = sum + pow_a[i]; System.out.println(“sum=“+sum); } 合計の 計算 } public static int power( int x, int n ){略} } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 37
  • 配列のまとめ int型配列 int[] double型配列 double[] 配列の領域確保 double[] x; x = new double[3]; x 配列は参照型 a.length ヒープ a が参照している配列の 長さ [0]=10.0 [1]=10.1 [2]=10.2 添え字は0から始まる 2008年8月,データ解析の基礎,加藤,瀬々,金子. 38
  • 目標 • 配列を理解する – 配列は多数のデータを表すのに便利 – データ群から統計量を求めよう – 配列に一気に数値を代入する方法 – メソッドに配列を渡すには • 2次元配列を理解する 2008年8月,データ解析の基礎,加藤,瀬々,金子. 39
  • 数値データ群の統計量を計算してみよう 遺伝子ネットワークの場合 • 統計量の例 – 合計 – 平均 – 最大値,最小値 ネットワークの性質を調べたい 数値データ 遺伝子 1 2 3 4 5 6 7 次数 2 2 1 4 3 2 2 2008年8月,データ解析の基礎,加藤,瀬々,金子. 40
  • 数値データ群の統計量を計算してみよう 遺伝子ネットワークの場合 • 統計量の例 – 合計 – 平均 – 最大値,最小値 ネットワークの性質を調べたい 数値データ 遺伝子 1 2 3 4 5 6 7 次数 2 2 1 4 3 2 2 辺の数 = 次数の合計/2 2008年8月,データ解析の基礎,加藤,瀬々,金子. 41
  • 数値データ群の統計量を計算してみよう 遺伝子ネットワークの場合 • 統計量の例 – 合計 – 平均 – 最大値,最小値 ネットワークの性質を調べたい 数値データ 遺伝子 1 2 3 4 5 6 7 次数 2 2 1 4 3 2 2 次数の平均から,ネットワークがどれくらい密か分かる 2008年8月,データ解析の基礎,加藤,瀬々,金子. 42
  • 数値データ群の統計量を計算してみよう 遺伝子ネットワークの場合 • 統計量の例 – 合計 – 平均 – 最大値,最小値 ネットワークの性質を調べたい 数値データ 遺伝子 1 2 3 4 5 6 7 次数 2 2 1 4 3 2 2 最大次数を持つ遺伝子はハブと呼ばれる重要な遺伝子である 2008年8月,データ解析の基礎,加藤,瀬々,金子. 43
  • 配列データの最大値を探すには 配列データ中,最大の数値を見つけるプログラム Test07c.java public class Test07c { 計算方法: public static void main( String[] args ){ int[] a; データを一つずつみて int i; 新記録なら記録を更新する int max_a; a = new int[3]; a[0]=3; a[1]=7; a[2]=4; 計算機で表現できる最小の整数を max_a = Integer.MIN_VALUE; 変数 max_a に代入 for ( i = 0; i < a.length; i++ ){ if ( max_a < a[i] ){ } } max_a = a[i]; }変数a[i]の値がmax_aより大きいなら max_a に a[i] を代入する System.out.println(“max_a=“+max_a); } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 44
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 2008年8月,データ解析の基礎,加藤,瀬々,金子. 45
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0] [1] [2] 2008年8月,データ解析の基礎,加藤,瀬々,金子. 46
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 47
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=最小整数 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 48
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=0 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=最小整数 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 49
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=0 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=最小整数 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 50
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=0 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=最小整数 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 51
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=0 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=3 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 52
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=1 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=3 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 53
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=1 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=3 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 54
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=1 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=3 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 55
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=1 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=7 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 56
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=2 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=7 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 57
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=2 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=7 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 58
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=2 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=7 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 59
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=3 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=7 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 60
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=3 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=7 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 61
  • 最大値計算の過程 Test07c.java スタック メモリの一部 public class Test07c { main のスタックフレーム public static void main( String[] args ){ int[] a; a i=3 int int i; max_a; 長さ3の配列を生成 a = new int[3]; max_a=7 a[0]=3; a[1]=7; a[2]=4; max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ } if ( max_a < a[i] ){ } max_a = a[i]; } 最大値の 計算 System.out.println(“max_a=“+max_a); } } ヒープ メモリの一部 [0]=3 [1]=7 [2]=4 2008年8月,データ解析の基礎,加藤,瀬々,金子. 62
  • 練習7-c. Test07c.java プロジェクト名: test07 public class Test07c { public static void main( String[] args ){ デバッガを使って int[] a; (1) max_a が正しく int i; int max_a; 更新されていく過程 a = new int[3]; a[0]=3; a[1]=7; a[2]=4; を観測せよ (2) 配列データの数値を max_a = java.lang.Integer.MIN_VALUE; for ( i = 0; i < a.length; i++ ){ 適当に変更しても if ( max_a < a[i] ){ max_a = a[i]; 正しく最大値が } 計算されることを } System.out.println(“max_a=“+max_a); 確認せよ } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 63
  • 練習7-d. Test07d.java プロジェクト名: test07 public class Test07c { public static void main( String[] args ){ 最小値を求める int[] a; プログラムを完成させよ int int i; min_a; 最小値をこの変数に入れる a = new int[3]; a[0]=3; a[1]=7; a[2]=4; min_a = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ if ( min_a > a[i] ){ この部分を埋めよ min_a = a[i]; int型の最大値 } java.lang.Integer.MAX_VALUE; } System.out.println(“min_a=“+min_a); } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 64
  • 練習7-e. Test07e.java プロジェクト名: test07 このプログラムは最小値 を求め,何番目のデータ public class Test07c { public static void main( String[] args ){ が最小値をとるか計算す int[] a; int i, i_min; るプログラムである int min_a; a = new int[3]; この場合, a[0]=7; a[1]=3; a[2]=4; 以下のような出力となる i_min = -1; 画面 min_a = java.lang.Integer.MAX_VALUE; min_a=3 for ( i = 0; i < a.length; i++ ){ i_min=1 if ( min_a > a[i] ){ min_a = a[i]; } i_min = i; (1) 数値を適当に変更して } みて,それでも正しく System.out.println(“min_a=“+min_a); System.out.println(“i_min=“+i_min); 計算されることを確認 } } せよ (2) なぜ最小データの番号 が計算できるか考えよ 2008年8月,データ解析の基礎,加藤,瀬々,金子. 65
  • 練習7-e0. Test07e0.java プロジェクト名: test07 このプログラムは最大値 を求め,何番目のデータ public class Test07c { public static void main( String[] args ){ が最大値をとるか計算す int[] a; int i, i_max; るプログラムを完成させよ int max_a; a = new int[3]; a[0]=7; a[1]=3; a[2]=4; // Compute the maximal number and its index System.out.println(“max_a=“+max_a); System.out.println(“i_max=“+i_max); } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 66
  • 目標 • 配列を理解する – 配列は多数のデータを表すのに便利 – データ群から統計量を求めよう – 配列に一気に数値を代入する方法 – メソッドに配列を渡すには • 2次元配列を理解する 2008年8月,データ解析の基礎,加藤,瀬々,金子. 67
  • 最小値計算プログラム再考 Test07d.java プロジェクト名: test07 public class Test07f { 下の2つのコードは等価 public static void main( String[] args ){ int[] a; int i; a = new int[3]; int min_a; a[0]=3; a[1]=7; a[2]=4; a = new int[3]; a[0]=3; a[1]=7; a[2]=4; 長さ3の配列を確保し min_a = java.lang.Integer.MAX_VALUE; それから値を代入 for ( i = 0; i < a.length; i++ ){ if ( min_a > a[i] ){ min_a = a[i]; a = new int[]{3,7,4}; } } 初期値{3,7,4} の配列を確保 System.out.println(“min_a=“+min_a); } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 68
  • 「配列の初期化」を使うと2行が1行に Test07f.java プロジェクト名: test07 public class Test07f { public static void main( String[] args ){ int[] a; int i; int min_a; a = new int[]{3,7,4}; min_a = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ if ( min_a > a[i] ){ min_a = a[i]; } } System.out.println(“min_a=“+min_a); } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 69
  • 目標 • 配列を理解する – 配列は多数のデータを表すのに便利 – データ群から統計量を求めよう – 配列に一気に数値を代入する方法 – メソッドに配列を渡すには • 2次元配列を理解する 2008年8月,データ解析の基礎,加藤,瀬々,金子. 70
  • 最小値計算部分をメソッドに プロジェクト名: test07 Test07g.java public class Test07g { public static void main( String[] args ){ int[] a; int min_a; これでmainメソッドは a = new int[]{3,7,4}; スッキリ min_a = min(a); System.out.println(“min_a=“+min_a); } public static int min( int[] a ){ int i, ret; 配列を引数にするメソッド ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ if ( ret > a[i] ){ ret = a[i]; } } return ret; } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 71
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); } public static int min( int[] a ){ int i, ret; ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 72
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); } public static int min( int[] a ){ int i, ret; ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 73
  • min(a)を呼び出す すると新たなスタックフレームが作られる プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret if ( ret > a[i] ){ ret = a[i]; } 引数には,配列全体がコ } ピーされるのではなくて ヒープ メモリの一部 return ret; [0]=3 [1]=7 [2]=4 } } 参照のみがコピーされて いることに注意. 2008年8月,データ解析の基礎,加藤,瀬々,金子. 74
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=最大整数 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 75
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=0 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=最大整数 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 76
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=0 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=最大整数 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 77
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=0 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 78
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=1 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 79
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=1 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 80
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=1 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 81
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=1 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 82
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=2 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 83
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=2 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 84
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=3 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 85
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=3 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 86
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a min_a = min(a); System.out.println(“min_a=“+min_a); min のスタックフレーム } public static int min( int[] a ){ int i, ret; a i=3 ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ ret=3 if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 87
  • どのように計算されているか プロジェクト名: test07 スタック メモリの一部 Test07g.java main のスタックフレーム public class Test07g { public static void main( String[] args ){ a int[] a; int min_a; a = new int[]{3,7,4}; min_a=3 min_a = min(a); System.out.println(“min_a=“+min_a); } public static int min( int[] a ){ int i, ret; ret = java.lang.Integer.MAX_VALUE; for ( i = 0; i < a.length; i++ ){ if ( ret > a[i] ){ ret = a[i]; } } ヒープ メモリの一部 return ret; } [0]=3 [1]=7 [2]=4 } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 88
  • 練習7-h Test07h.java プロジェクト名: test07 public class Test07h { public static void main( String[] args ){ 最小値,最大値, int[] a; 平均値を求める int min_a, max_a; double mean_a; プログラムを完成 a = new int[]{3,7,4}; させよ min_a = min(a); max_a = max(a); mean_a = mean(a); System.out.println(“min_a=“+min_a); System.out.println(“max_a=“+max_a); System.out.println(“mean_a=“+mean_a); } public static int min( int[] a ){ 最小値を計算するメソッド この部分を埋めよ } public static int max( int[] a ){ 最大値を計算するメソッド } この部分を埋めよ public static double mean( int[] a ){ 平均値を計算するメソッド この部分を埋めよ } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 89
  • 1次元配列のまとめ 1次元int型配列 int[] 1次元double型配列 double[] メソッドの引数が配列のとき 参照のみ引数にコピーされる 1次元配列の領域確保 i.e. 配列の実体はコピーされない double[] x; 例: x = new double[3]]; public static int max(int[] a) 1次元配列の初期化子 double[] x; x = new double[]{10.0,10.1,10.2}; x 配列は参照型 a.length ヒープ a が参照している配列の 長さ [0]=10.0 [1]=10.1 [2]=10.2 添え字は0から始まる 2008年8月,データ解析の基礎,加藤,瀬々,金子. 90
  • 目標 • 配列を理解する – 配列は多数のデータを表すのに便利 – データ群から統計量を求めよう – 配列に一気に数値を代入する方法 – メソッドに配列を渡すには • 2次元配列を理解する 2008年8月,データ解析の基礎,加藤,瀬々,金子. 91
  • 細胞間の関係を遺伝子発現量から調べたい 3つの細胞から遺伝子xと遺伝子yの 発現量測定した 細胞1 細胞2 細胞3 遺伝子x +3.0 -2.0 +1.0 遺伝子y +1.0 +3.0 +0.5 2008年8月,データ解析の基礎,加藤,瀬々,金子. 92
  • 細胞間の関係を遺伝子発現量から調べたい 3つの細胞から遺伝子xと遺伝子yの 発現量測定した 細胞1 細胞2 細胞3 遺伝子x +3.0 -2.0 +1.0 遺伝子y +1.0 +3.0 +0.5 3点間の距離行列を計算すると 細胞1 細胞2 細胞3 細胞1 0.00 5.39 2.06 細胞2 5.39 0.00 3.91 細胞3 2.06 3.91 0.00 ↑プログラムで計算してみよう 2008年8月,データ解析の基礎,加藤,瀬々,金子. 93
  • 距離行列を表すには2次元配列が便利 Test08a.java このプログラムは,2次元平面上 import java.lang.Math; の点(3,1),(-2,3),(4,0.5)が与えられた public class Test08a { public static void main( String[] args ){ として,この3点間の距離行列を double[] x, y; 計算して表示する double[][] distmat; x = new double[]{ 3.0,-2.0, 4.0 }; y = new double[]{ 1.0, 3.0, 0.5 }; distmat = comp_distmat( x, y ); 距離行列を計算する pri_ary2d( distmat ); } 距離行列を表示する public static double[][] comp_distmat( double[] x, double[] y ){ double[][] ret; 距離行列を計算するメソッド int j, i; assert x.length == y.length; 2次元配列を確保する ret = new double[x.length][x.length]; for ( i = 0; i < x.length; i++ ){ for ( j = 0; j < x.length; j++ ){ ret[i][j] = Math.sqrt( (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]) ); } 点(x[i],y[i])と点(x[j],y[j])のユークリッド距離を計算する } return ret; } public static void pri_ary2d( double[][] mat ){略} } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 94
  • 2次元配列のイメージ double[][] x; 2次元配列型の変数 ret を宣言する x = new double[3][4]; 3行4列の2次元配列を確保する 2次元配列のイメージ Javaの2次元配列は配列の配列で実現されている ヒープ 2008年8月,データ解析の基礎,加藤,瀬々,金子. 95
  • 距離行列を計算する Test08a.java このプログラムは,2次元平面上 import java.lang.Math; の点(3,1),(-2,3),(4,0.5)が与えられた public class Test08a { public static void main( String[] args ){ として,この3点間の距離行列を double[] x, y; 計算して表示する double[][] distmat; x = new double[]{ 3.0,-2.0, 4.0 }; y = new double[]{ 1.0, 3.0, 0.5 }; distmat = comp_distmat( x, y ); 距離行列を計算する pri_ary2d( distmat ); } 距離行列を表示する public static double[][] comp_distmat( double[] x, double[] y ){ double[][] ret; 距離行列を計算するメソッド int j, i; assert x.length == y.length; 2次元配列を確保する ret = new double[x.length][x.length]; for ( i = 0; i < x.length; i++ ){ for ( j = 0; j < x.length; j++ ){ ret[i][j] = Math.sqrt( (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]) ); } 点(x[i],y[i])と点(x[j],y[j])のユークリッド距離を計算する } return ret; } public static void pri_ary2d( double[][] mat ){略} } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 96
  • 距離行列を表示する Test08a.java このプログラムは,2次元平面上 import java.lang.Math; の点(3,1),(-2,3),(4,0.5)が与えられた public class Test08a { public static void main( String[] args ){ として,この3点間の距離行列を double[] x, y; 計算して表示する double[][] distmat; x = new double[]{ 3.0,-2.0, 4.0 }; y = new double[]{ 1.0, 3.0, 0.5 }; distmat = comp_distmat( x, y ); 距離行列を計算する pri_ary2d( distmat ); } 距離行列を表示する public static double[][] comp_distmat( double[] x, double[] y ){略} public static void pri_ary2d( double[][] mat ){ int i, j, nrows, ncols; 距離行列を表示するメソッド nrows = mat.length; ncols = mat[0].length; for ( i = 0; i < nrows; i++ ){ for ( j = 0; j < ncols; j++ ){ System.out.printf( quot;%5.2fquot;, mat[i][j] ); } System.out.println(); } } } 2008年8月,データ解析の基礎,加藤,瀬々,金子. 97
  • 2次元配列を使ったときのメモリの様子 Test08a.java このプログラムは,2次元平面上 import java.lang.Math; の点(3,1),(-2,3),(4,0.5)が与えられた public class Test08a { public static void main( String[] args ){ として,この3点間の距離行列を double[] x, y; 計算して表示する double[][] distmat; x = new double[]{ 3.0,-2.0, 4.0 }; y = new double[]{ 1.0, 3.0, 0.5 }; distmat = comp_distmat( x, y ); 距離行列を計算する pri_ary2d( distmat ); } 距離行列を表示する public static double[][] comp_distmat( double[] x, double[] y ){略} public static void pri_ary2d( double[][] mat ){略} } スタック ヒープ x 3.0 -2.0 4.0 0.00 5.39 1.12 y 1.0 3.0 0.5 5.39 0.00 6.50 distmat 1.12 6.50 0.00 2008年8月,データ解析の基礎,加藤,瀬々,金子. 98
  • 練習8-a Test08a.java このプログラムは,2次元平面上 import java.lang.Math; の点(3,1),(-2,3),(4,0.5)が与えられた public class Test08a { public static void main( String[] args ){ として,この3点間の距離行列を double[] x, y; 計算して表示する double[][] distmat; x = new double[]{ 3.0,-2.0, 4.0 }; y = new double[]{ 1.0, 3.0, 0.5 }; distmat = comp_distmat( x, y ); 距離行列を計算する pri_ary2d( distmat ); } 距離行列を表示する public static double[][] comp_distmat( double[] x, double[] y ){略} public static void pri_ary2d( double[][] mat ){略} } (1) 上記のプログラムを作成して実行せよ (2) 数値を適当に変更しても正しく動くことを確認せよ 2008年8月,データ解析の基礎,加藤,瀬々,金子. 99
  • 1次元配列のまとめ 1次元int型配列 int[] 1次元double型配列 double[] メソッドの引数が配列のとき 参照のみ引数にコピーされる 1次元配列の領域確保 i.e. 配列の実体はコピーされない double[] x; 例: x = new double[3]; public static int max(int[] a) 1次元配列の初期化子 double[] x; x = new double[]{10.0,10.1,10.2}; x 配列は参照型 a.length ヒープ a が参照している配列の 長さ [0]=10.0 [1]=10.1 [2]=10.2 添え字は0から始まる 2008年8月,データ解析の基礎,加藤,瀬々,金子. 100
  • 2次元配列 2次元int型配列 int[][] 2次元double型配列 double[][] 2次元配列の領域確保 double[][] x; x = new double[4][4]; 2次元配列の初期化子 double[][] x; x = new double[][]{{10.0,10.1,10.2},{11.0,11.1,11.2}}; 2008年8月,データ解析の基礎,加藤,瀬々,金子. 101