雨谷の日和

過去19年で2,600を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

Cでの行列式計算(再帰無し、事前メモリ確保)

もはや私の趣味でしかないが、考え付くパターンについて実測を続けよう。
今度は、再帰呼び出しを展開した場合の、事前メモリ確保でのソースコードを見てみよう。

long expand11(long array[]) {
  int i, j, k, l;
  long value = 0;
  long *subarray = array_buf[9];
  for(i = 0; i < 11; ++i) {
    l = 0;
    for(j = 0; j < 11; ++j){
      if(j != i){
        for(k = 1; k < 11; ++k)subarray[(l * 10) + k - 1] = array[(j * 11) + k];
        ++l;
      }
    }
    if(i % 2 == 0){
      value += (array[i * 11] * expand10(subarray));
    }else{
      value -= (array[i * 11] * expand10(subarray));
    }
  }
  return value;
}

int main(){
  int i;
  long value;
  long array[11 * 11] = {
    1, 2, 3, 4, 6, 1, 7, 1, 9, 0, 0, 
    5, 1, 5, 7, 7, 3, 5, 3, 6, 1, 6, 
    7, 6, 4, 8, 4, 6, 1, 7, 1, 4, 8, 
    6, 5, 1, 0, 1, 5, 9, 1, 7, 5, 1, 
    2, 3, 1, 1, 5, 8, 4, 6, 3, 1, 5, 
    3, 1, 0, 3, 2, 9, 4, 8, 0, 3, 1, 
    3, 2, 8, 5, 0, 6, 3, 4, 4, 8, 5, 
    4, 9, 9, 4, 6, 1, 0, 1, 2, 1, 6, 
    9, 7, 6, 1, 6, 4, 5, 2, 9, 4, 4, 
    1, 2, 2, 2, 8, 3, 4, 9, 1, 2, 4, 
    6, 1, 6, 4, 4, 8, 6, 3, 4, 1, 4, 
  };

  array_buf = (long **)malloc(10 * sizeof(long *));
  for(i = 0; i < 10; ++i)array_buf[i] = (long *)malloc(11 * 11 * sizeof(long)); 

  value = expand11(array);
  printf("result: %d\n", value);

  for(i = 0; i < 10; ++i)free(array_buf[i]);
  free(array_buf);
  return 0;
}

expand10〜expand01 は省略してある。
main関数は2004.04.16でのソースコードとほぼ同じである。
各expand 関数では、予め確保してある配列に読み書きをする。
では、次回はこの実行結果を見てみよう。