Я пытаюсь прочитать временной ряд из csv-файла.
Каждая строка содержит 256 (может измениться в будущем) элементов, которые я хочу обработать как точку в 256-мерном пространстве.
Затем я хочу выполнить кластеризацию k-средних, чтобы найти наиболее k значимых временных рядов, описывающих данные.
В настоящее время я читаю csv-файл, сохраняя каждую строку в
std::vector<double> temprow
и затем получаю
std::vector<std::vector<double>> data_vect
. Затем я преобразую в
cv::Mat data_mat = cv::Mat::zeros((int)all_data.size(), (int)all_data[0].size(), CV_32F)
, перебирая векторы, используя
for (int rows = 0; rows < (int)all_data.size(); rows++) {
for (int cols = 0; cols < (int)all_data[0].size(); cols++) {
data_mat.at<double>(rows, cols) = all_data[rows][cols];
}
}
return data_mat;
Это оставляет мне cv :: Mat со следующими свойствами:
std::cout << "Rows: " << data.rows << std::endl; //Rows: 52178
std::cout << "Cols: " << data.cols << std::endl; //Cols: 256
std::cout << "Dims: " << data.dims << std::endl; //Dims: 2
Затем я выполняю кластеризацию k-средних следующим образом:
cv::Mat labels,centers;
int k = 256;
int attempts = 10;
cv::TermCriteria criteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 10, 1.0);
cv::kmeans(data_mat, k, labels, criteria, attempts, cv::KMEANS_PP_CENTERS, centers);
, что в моем пониманиидолжен заполнить центров значениями центра каждого кластера, оставляя меня с матрицей ak * n (в данном случае 256 * 256).
Однако, когда я звоню
std::cout << "Rows: " << centers.rows << std::endl; //Hopefully 256
std::cout << "Cols: " << centers.cols << std::endl; //Hopefully 256
Я получаю это общее сообщение об ошибке:
Исключение выдается в 0x00007FF806C86020 (opencv_world341.dll) в Project1.exe: 0xC0000005: Место чтения нарушения прав доступа 0x0000024B9ECAFC80.
Свойства центров в этой точке программы:
flags 1124007936 int
dims 0 int
rows 0 int
cols 0 int
+ data 0x0000000000000000 <NULL> unsigned char *
+ datastart 0x0000000000000000 <NULL> const unsigned char *
+ dataend 0x0000000000000000 <NULL> const unsigned char *
+ datalimit 0x0000000000000000 <NULL> const unsigned char *
+ allocator 0x0000000000000000 <NULL> cv::MatAllocator *
+ u 0x0000000000000000 <NULL> cv::UMatData *
+ size {p=0x000000bdfc93f9e8 {0} } cv::MatSize
+ step {p=0x000000bdfc93fa30 {0} buf=0x000000bdfc93fa30 {0, 0} } cv::MatStep
Так что, кажется, центры пустые.Поэтому, возможно, вход data_mat имеет неправильную форму, так что kmeans () ничего не выводит в центры, но, опять же, я не получаю никакого сообщения об ошибке для kmeans ()
Большое спасибо заранее за вашу работу и помощь,
Тимо
Редактировать 1: ошибка происходит внутри kmeans () , потому что
cv::kmeans(data_mat, k, labels, criteria, attempts, cv::KMEANS_PP_CENTERS, centers);
std::cout << "Finished k-means" << std::endl;
метка не выводится на консоль.Тем не менее, льняной номер ошибки был kmeans () + 1, поэтому я просто выяснил это, поместив туда общий шаблон.