雨谷の日和

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

行列式計算改良(先頭アドレスのみコピー)インデックス版(alloca)

2004.07.24のものはmallocでメモリの確保を行っていたが、今度はそれをallocaで行う場合を見てみよう。
ソースコードは以下のようになるだろう。

#include 
#include 

long array[ ] = {
  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, 
};

long expand(int *indexarray, int dim) {
  int i, j, l;
  int *indexsubarray;
  long value = 0;
  if(dim < 2)return array[indexarray[0]];
  indexsubarray = alloca( (dim - 1) * sizeof(int) );
  for(i = 0; i < dim; ++i){
    l = 0;
    for(j = 0; j < dim; ++j){
      if(i != j){
        indexsubarray[l] = indexarray[j] + 1;
        ++l;
      }
    }
    if(i % 2){
      value += (array[indexarray[i]] * expand(indexsubarray, (dim - 1)));
    }
    else{
      value -= (array[indexarray[i]] * expand(indexsubarray, (dim - 1)));
    }
  }
  return value;
}
 
int main() {
  int i;
  long value;
  int *indexarray;
  indexarray = alloca(11 * sizeof(int));
  for(i = 0; i < 11; ++i)indexarray[i] = i * 11;
  value = expand(indexarray, 11);
  printf("result:%ld\n",value);
  return 0;
}

次回、この実測を行ってみる。