Есть ли эквивалентная функция в C / C ++ для GNU-R, которая ()? - PullRequest
5 голосов
/ 23 мая 2011

Позвольте мне объяснить, что делает функция which:

Из справки GNU-R:

какие показатели ИСТИНА?

Приведите индексы «ИСТИНА» для логического объекта с учетом индексов массива.

или показ некоторого кода: (GNU-R начинает считать индексы с 1)

> x <- c(1,2,3,1,3,5);
> which(x == 1);
[1] 1 4
> which(x == 3);
[1] 3 5
> ll <- c(TRUE,FALSE,TRUE,NA,FALSE,FALSE,TRUE);
> which(ll);
[1] 1 3 7

Кто-нибудь знает подобную функцию в C / C ++?

Спасибо за вашу помощь

rinni

Ответы [ 3 ]

6 голосов
/ 23 мая 2011

Вы должны понимать, что R векторизовано, в то время как C в первую очередь работает с отдельными атомистическими фрагментами данных: один int, double, ...

сC ++, вы можете взглянуть на алгоритмы STL, с которыми вы подходите к этому.

Наконец, на пересечении R и C ++ наш пакет Rcpp имеет некоторые векторизованные операции в C ++, которые имитируют некоторые операции;см. Rcpp-sugar pdf виньетка для получения дополнительной информации (и / или некоторых наших переговоров по Rcpp).

3 голосов
/ 23 мая 2011

Создайте объект функтора, который вы можете инициализировать значением совпадения, и итерацию по списку, используя std::for_each.Так, например:

vector<int> values;
//fill your vector with values;

struct match_functor
{
    vector<int> value_array;
    int match_value;

    match_functor(int value): match_value(value) {}

    void operator() (int input_value)
    {
        if(match_value == input_value)
            value_array.push_back(input_value);
    }
};

match_functor matches(1);
std::for_each(values.begin(), values.end(), matches);

Теперь к вашему массиву значений результатов можно получить доступ, используя matches.value_array[INDEX].

В качестве альтернативы, если вы просто хотите получить признаки исходного вектора, скореечем действительные значения, то вы можете сделать что-то вроде этого для вашего объекта функтора:

struct match_functor
{
    vector<int> index_array;
    int match_value;
    int index;

    match_functor(int value): match_value(value), index(0) {}

    void operator() (int input_value)
    {
        if(match_value == input_value)
            index_array.push_back(index);

        index++;
    }
};

match_functor matches(1);
matches = std::for_each(values.begin(), values.end(), matches);

Теперь matches.index_array[INDEX] будет содержать признаки вектора orignal, которые соответствуют значению 1, а не фактическомузначения из исходного вектора.

2 голосов
/ 23 мая 2011

алгоритм std::find_if должен добиться цели - в сочетании с циклом я должен добавить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...