C++でソートした配列から中央値を求める時のエラー
繰り返し処理の各処理におけるパフォーマンスを配列に入れて、その中央値を求めるプログラムを書いています。繰り返し処理は、行列の足し算で各要素を足す処理を指しています。
前回までの質問に続いて、こちらの質問をします。
解決したいこと
中央値を求める部分で関数呼び出し後の型に関するエラーを解決したい
コンパイルエラー(errorのみ抜粋、warningは除く)
下二つのエラーは1つ目のエラーに起因すると考えています。
1つ目は型に関してのエラーであることは推測できるのですが、中央値を求めるmedian()関数を呼び出す前の型doubleと合わせて、どのようにコードを修正すればいいかわかりません。
$ g++ -o sample_med sample_median.cpp
sample_median.cpp:25:14: error: invalid operands to binary expression
('double' and 'int')
if (size % 2 == 1) {
~~~~ ^ ~
sample_median.cpp:83:5: error: use of undeclared identifier 'ans'
ans = median(timedata);
^
sample_median.cpp:84:18: error: use of undeclared identifier 'ans'; did you mean
'abs'?
std::cout << ans << std::endl;
^~~
abs
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/stdlib.h:113:44: note:
'abs' declared here
inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT ...
現行のコード
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>
#include <algorithm>
#include <iostream>
//繰り返し処理全体にかかった時間
using namespace std::chrono;
double median(std::vector<double>v) {
double size = v.size();
std::vector<double> _v(v.size());
copy(v.begin(), v.end(), back_inserter(_v));
double tmp;
for (int i = 0; i < size - 1; i++){
for (int j = i + 1; j < size; j++) {
if (_v[i] > _v[j]){
tmp = _v[i];
_v[i] = _v[j];
_v[j] = tmp;
}
}
}
if (size % 2 == 1) {
return _v[(size - 1) / 2];
} else {
return (_v[(size / 2) - 1] + _v[size / 2]) / 2;
}
}
int main()
{
#define N 2
double A[N][N] = {
{3.0, 5.0},
{9.0, 5.0}
};
double B[N][N] = {
{3.0, 6.0},
{8.0, 9.0}
};
double C[N][N] = {
{0.0, 0.0},
{0.0, 0.0}
};
int i, j, k, n;
//各足し算にかかった時間を入れる配列
std::vector<double> timedata;
for(i=0; i<N; i++){
for(j=0; j<N; j++){
//測定開始
std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
C[i][j] += A[i][j]+B[i][j];
//測定終了
high_resolution_clock::time_point end = high_resolution_clock::now();
double time = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
//配列にappend
timedata.push_back(time);
}
}
//ソート前
for (auto value : timedata) {std::cout << value << ", ";
std::cout << std::endl;
}
//配列をソート
std::cout << "After Sorted"<< std::endl;
std::sort(timedata.begin(), timedata.end());
for (auto value : timedata) {std::cout << value << ", ";
std::cout << std::endl;
}
ans = median(timedata);
std::cout << ans << std::endl;
}