#c #multithreading #armadillo #subsampling
#c #многопоточность #armadillo #подвыборка
Вопрос:
Я просматривал документацию и примеры Armadillo, но, похоже, нет реального эффективного способа подвыборки (или повторной выборки) большого вектора или матрицы, так что, если у вас изначально было N элементов, в итоге вы получите N / k элементов. Есть несколько методов для перетасовки и сдвига, но это все.
Итак, я просто перебираю все элементы последовательно, но, конечно, должен быть лучший способ, кроме векторизации по доступным ядрам?
bool subsample(configamp; cfg, arma::matamp; data, int skippCount)
{
const auto processor_count = 1; // currently not using threading because 'inplace'
const size_t cols = data.n_cols;
const size_t period = skippCount 1 ;
size_t newCols = cols / period;
newCols = (0 == (cols % period)) ? 0 : 1;
const size_t blockSize = 256;
std::vector<thread> workers;
for (size_t blockID = 0; blockID < newCols / blockSize; blockID) {
workers.push_back(std::thread([amp;data, blockID, newCols, period]() {
// copy blockSize elements inplace (overwrites other entries))
size_t c = blockID * blockSize;
for (size_t b = 0; (c < newCols) amp;amp; (b < blockSize); c , b ) {
arma::vec v = data.col(period * c);
data.col(c) = v;
}
}));
if (workers.size()==processor_count) {
for (autoamp; thread : workers) thread.join();
workers.clear();
}
}
for (autoamp; thread : workers) thread.join(); // make sure all threads finish
data.resize(data.n_rows, newCols);
return true;
}
Если у вас есть какие-либо предложения по улучшению этого, мы будем очень признательны. Также было бы неплохо сделать это «на месте», чтобы сэкономить память.
Комментарии:
1. «подвыборка» в каком смысле? Чтобы сохранить подмножество столбцов или строк, используйте подматрицы с формой
X.cols(vector_of_column_indices)
илиX.submat(vector_of_row_indices, vector_of_column_indices)
. Для интерполяции (которая может использоваться для сокращения данных) существует interp1() . Чтобы помочь с обработкой сигнала с понижающей дискретизацией, попробуйте conv() , conv2() и fft() .2. О, вау, я пропустил эти варианты. На самом деле это не операции на месте, но, по крайней мере, похоже на то, что я искал, спасибо. Если вы поместите это в ответ, я соглашусь.
3. @mtall вы знаете, выполняются ли .cols() или .submat() на оборудовании NV (GPU) при подключении к nvblas?