首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将R split()函数转换为C++

将R split()函数转换为C++
EN

Stack Overflow用户
提问于 2021-08-20 07:52:57
回答 2查看 93关注 0票数 0

考虑R中的可重现示例:

代码语言:javascript
运行
复制
test <- c(1:12)
> test
 [1]  1  2  3  4  5  6  7  8  9 10 11 12

预期结果:

代码语言:javascript
运行
复制
test.list <- split(test, gl(2, 3))
> test.list
$`1`
[1] 1 2 3 7 8 9

$`2`
[1]  4  5  6 10 11 12

我正在尝试用C++编写等价的代码,以生成并返回从test.list得到的两个向量。请注意,在C++中,我正处于尴尬的新手阶段。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-20 12:31:04

我们可以使用@jignatius的很好的答案,并使它成为一个R可调用的函数。为了简单起见,我把它放在NumericVector上;我们这里有一大堆答案,它们显示了如何根据运行时负载在NumericVectorIntegerVector之间切换。

代码

代码语言:javascript
运行
复制
#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::List mysplit(Rcpp::NumericVector nums, int n, int size) {
    std::vector<std::vector<double>> result(n);
    int i = 0;
    auto beg = nums.cbegin();
    auto end = nums.cend();

    while (beg != nums.cend()) {
        //get end iterator safely
        auto next = std::distance(beg, end) >= size ? beg + size : end;
        //insert into result
        result[i].insert(result[i].end(), beg, next);
        //advance iterator
        beg = next;
        i = (i + 1) % n;
    }

    Rcpp::List ll;
    for (const auto&v : result)
        ll.push_back(v);

    return ll;
}

/*** R
testvec <- 1:12
mysplit(testvec, 2, 3)
*/

输出

代码语言:javascript
运行
复制
> Rcpp::sourceCpp("~/git/stackoverflow/68858728/answer.cpp")

> testvec <- 1:12

> mysplit(testvec, 2, 3)
[[1]]
[1] 1 2 3 7 8 9

[[2]]
[1]  4  5  6 10 11 12

> 

原始问题中有一个小错误,因为我们不需要调用gl();只需要两个标量。

票数 5
EN

Stack Overflow用户

发布于 2021-08-20 10:28:46

试试这个,它创建了一个矢量向量,其中包含交替分块的源元素:

代码语言:javascript
运行
复制
#include <iostream>
#include <vector>

template<typename T>
std::vector<std::vector<T>> split(std::vector<T> nums, int n, int size)
{
    std::vector<std::vector<T>> result(n);
    int i = 0;
    auto beg = nums.cbegin();
    auto end = nums.cend();

    while (beg != nums.cend()) {
        //get end iterator safely
        auto next = std::distance(beg, end) >= size ? beg + size : end;
        //insert into result
        result[i].insert(result[i].end(), beg, next);
        //advance iterator
        beg = next;
        i = (i + 1) % n;
    }

    return result;
}

int main()
{
    std::vector<int> vnums = { 1, 2, 3,  4,  5,  6,  7,  8,  9, 10, 11, 12 };
    auto vectors = split(vnums, 2, 3);

    for (const auto& v : vectors)
    {
        for (auto num : v) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    }
}

Demo

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68858728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档