Использование `std :: generate` или` std :: fill` для заполнения `arma :: mat` - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь написать обертку вокруг gmm_full и gmm_diag, чтобы они были mvnorm_distribution.Мне нужна эта конкретная настройка, потому что я имею дело с входным файлом и хотел бы, чтобы все работало более или менее так же, как std::*_distribution s.У меня есть оболочка, и она работает так, как мне хотелось бы, но мне трудно заполнить arma::mat с помощью любого из std алгоритмов.По сути, у меня есть что-то вроде этого:

arma::vec gen() {
    // gmm_full model initilization
    return model.generate();
}

void main() {
    arma::mat m(dim, N);
    std::generate(m.begin_col(0), m.end_col(N-1), gen);
}

До сих пор я понял, что либо std::generate, либо m.being_col() не работают, как я ожидал.Я думал, что я получу вектор и смогу заполнить его, или это то, что сделал бы std::generate, но, очевидно, это не так.Я вижу в примере, что мне нужно разыменовать столбец, но тогда я не могу сделать это на std::generate.У меня есть std::fill и std::transform, но пока у меня нет успеха.

Одним из решений было бы написать класс генератора и передать каждое значение одно за другим, но тогда это не то, чего я действительно хочу.Мне было интересно, если кто-нибудь может мне помочь с этим.Я также знаю о model.generate(N), но я бы хотел обернуть дистрибутив и использовать его как другие std::*_distribution s, так что это не решило бы мою проблему, или это не так, и я не знаю, как использоватьэто.

PS Это технически продолжение этого вопроса , который я задавал ранее.

1 Ответ

0 голосов
/ 13 июня 2019

Мне кажется, я справился с использованием arma::mat::each_col.Это принимает лямбда-функцию и в основном перебирает столбцы.Итак, это будет что-то вроде этого:

    m.each_col([](vec& a) mutable {a = gen();});

Не забудьте передать a по ссылке.

Предостережение: это, вероятно, медленнее, чем arma::gmm_full::generate(N) или arma::mvnrnd.Так что, если вы просто хотите сгенерировать много сэмплов, сначала используйте их.

PS mutable не требуется, если вы не передаете дистрибутив в lambda.

...