ギークもどきの日記帳

雑多な知識が垂れ流される場所。ほとんど無害。

C言語でmapとreduce

#include <stdio.h>

#define ASIZE(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0]))

#define REDUCE(ARRAY, FUNC, RESULT) for (int i = 0; i < ASIZE(ARRAY); i++) RESULT = FUNC(RESULT, ARRAY[i])

#define MAP(ARRAY, FUNC, RESULT) for (int i = 0; i < ASIZE(ARRAY) || i < ASIZE(RESULT); i++) RESULT[i] = FUNC(ARRAY[i])

#define N 100
double height[N] = {
  148.7, 149.5, 133.7, 157.9, 154.2, 147.8, 154.6, 159.1, 148.2, 153.1,
  138.2, 138.7, 143.5, 153.2, 150.2, 157.3, 145.1, 157.2, 152.3, 148.3,
  152.0, 146.0, 151.5, 139.4, 158.8, 147.6, 144.0, 145.8, 155.4, 155.5,
  153.6, 138.5, 147.1, 149.6, 160.9, 148.9, 157.5, 155.1, 138.9, 153.0,
  153.9, 150.9, 144.4, 160.3, 153.4, 163.0, 150.9, 153.3, 146.6, 153.3,
  152.3, 153.3, 142.8, 149.0, 149.4, 156.5, 141.7, 146.2, 151.0, 156.5,
  150.8, 141.0, 149.0, 163.2, 144.1, 147.1, 167.9, 155.3, 142.9, 148.7,
  164.8, 154.1, 150.4, 154.2, 161.4, 155.0, 146.8, 154.2, 152.7, 149.7,
  151.5, 154.5, 156.8, 150.3, 143.2, 149.5, 145.6, 140.4, 136.5, 146.9,
  158.9, 144.4, 148.1, 155.5, 152.4, 153.3, 142.3, 155.3, 153.1, 152.3,
};

double add(double x, double y) {
  return x + y;
}
double add3(double x) {
  return x + 3;
}

int main(void) {
  double sum = 0;
  MAP(height, add3, height);
  REDUCE(height, add, sum);
  printf("sum = %f, avg = %f\n", sum, sum / N);
}

ASIZEマクロは配列変数名を受け取り、その要素数を返す。

REDUCEマクロは畳み込み、MAPマクロは写像を取る。どちらも、配列変数名、関数名、結果変数名を取る。

サンプルコードは http://www.geocities.jp/m_hiroi/linux/clang03.html からお借りしました。