最近有人建议我作为包管理器查看 conda。不幸的是,我没有成功地找到如何让我的编译器找到与 conda 安装的仅标头库?理想情况下,我希望根本不必手动指定编译器的路径。
(上下文是我来自 macOS 上的自制软件,它会在正确的位置创建符号链接。显然这是 conda 避免的。但是,如果有一种简单的方法来编译简单的示例就好了!)
例如,如果我的代码是下面的代码。注意:这个问题是通用的,与特定的包无关,我也不想再次手动指定我的特定虚拟环境。
#include <iostream>
#include <xtensor/xarray.hpp>
#include <xtensor/xio.hpp>
int main()
{
xt::xarray<double> a
{{1.0, 2.0, 3.0},
{2.0, 5.0, 7.0},
{2.0, 5.0, 7.0}};
std::cout << a;
}
Run Code Online (Sandbox Code Playgroud)
我已经使用“安装”了该库
conda create --name example
source activate example
conda install -c conda-forge xtensor-python
Run Code Online (Sandbox Code Playgroud)
现在我想编译
clang++ -std=c++14 test.cpp
Run Code Online (Sandbox Code Playgroud)
请注意,我知道这是有效的:
clang++ -std=c++14 -I~/miniconda3/envs/example/include test.cpp
Run Code Online (Sandbox Code Playgroud)
但我认为这不是我们想要的,因为:
example)。该文档非常清楚地说明了如何使 a 适应std::vector张量对象。
https://xtensor.readthedocs.io/en/latest/adaptor.html
std::vector<double> v = {1., 2., 3., 4., 5., 6. };
std::vector<std::size_t> shape = { 2, 3 };
auto a1 = xt::adapt(v, shape);
Run Code Online (Sandbox Code Playgroud)
但你怎么能反过来呢?
xt::xarray<double> a2 = { { 1., 2., 3.} };
std::vector<double> a2vector = ?;
Run Code Online (Sandbox Code Playgroud) xtensor我正在尝试从库中的 blob 数据创建一个数组caffe。使用例如 bymutable_cpu_data()中的函数返回指向数据的指针。这可能吗?如果是,请举个例子。我找到了使用 OpenCV 的示例,但很相似,这使得对矩阵等数据的操作变得更加容易。caffefloat* data = output->mutable_cpu_data();xtensorMatxtensornumpy
我最近尝试比较不同的 python 和 C++ 矩阵库的线性代数性能,以便了解在即将进行的项目中使用哪些库。虽然线性代数运算有多种类型,但我选择主要关注矩阵求逆,因为它似乎会给出奇怪的结果。我在下面编写了以下代码进行比较,但我想我一定做错了什么。
C++代码
#include <iostream>
#include "eigen/Eigen/Dense"
#include <xtensor/xarray.hpp>
#include <xtensor/xio.hpp>
#include <xtensor/xview.hpp>
#include <xtensor/xrandom.hpp>
#include <xtensor-blas/xlinalg.hpp> //-lblas -llapack for cblas, -llapack -L OpenBLAS/OpenBLAS_Install/lib -l:libopenblas.a -pthread for openblas
//including accurate timer
#include <chrono>
//including vector array
#include <vector>
void basicMatrixComparisonEigen(std::vector<int> dims, int numrepeats = 1000);
void basicMatrixComparisonXtensor(std::vector<int> dims, int numrepeats = 1000);
int main()
{
std::vector<int> sizings{1, 10, 100, 1000, 10000, 100000};
basicMatrixComparisonEigen(sizings, 2);
basicMatrixComparisonXtensor(sizings,2);
return 0;
}
void basicMatrixComparisonEigen(std::vector<int> dims, int numrepeats)
{
std::chrono::high_resolution_clock::time_point t1;
std::chrono::high_resolution_clock::time_point …Run Code Online (Sandbox Code Playgroud) 我是xtensor的新手.我想知道如何使用xt :: where的输出.在python中,例如假设imap是一个nd数组,np.where(imap> = 4)返回两个带索引的数组,可以使用=运算符直接赋值.请让我知道如何在xtensor C++上下文中使用它.任何小例子都会有很大的帮助.
谢谢.
我正在开发一个 C++ 项目,我需要 Numpy 之类的数组和 C++ 中的功能。我找到了一些替代方案,例如xtensor、NumCpp等。这些是仅标头的库。问题是我是第一次尝试 Bazel,所以我不知道如何将仅标头库添加到 Bazel 工作区。在 Bazel 的其他问题上提出了一些建议,例如 genrule-environment、rules-foreign-cc。我已将 http_archive 添加到 WORKSPACE 文件中,但我不确定要在 BUILD 文件中添加什么。
工作空间文件
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
all_content = """filegroup(name = "all", srcs = glob(["**"]), visibility = ["//visibility:public"])"""
http_archive(
name = "xtensor",
build_file_content = all_content,
strip_prefix = "xtensor-master",
urls = ["https://github.com/xtensor-stack/xtensor/archive/refs/heads/master.zip"],
)
http_archive(
name = "NumCpp",
build_file_content = all_content,
strip_prefix = "NumCpp-master",
urls = ["https://github.com/dpilger26/NumCpp/archive/refs/heads/master.zip"],
)
http_archive(
name = "rules_foreign_cc",
sha256 = "c2cdcf55ffaf49366725639e45dedd449b8c3fe22b54e31625eb80ce3a240f1e",
strip_prefix = "rules_foreign_cc-0.1.0",
url = "https://github.com/bazelbuild/rules_foreign_cc/archive/0.1.0.zip",
)
load("@rules_foreign_cc//:workspace_definitions.bzl", …Run Code Online (Sandbox Code Playgroud) 在使用cookiecutter设置并使用xsimd启用SIMD内部函数之后,我尝试了xtensor-python,并开始编写一个非常简单的sum函数。
inline double sum_pytensor(xt::pytensor<double, 1> &m)
{
return xt::sum(m)();
}
inline double sum_pyarray(xt::pyarray<double> &m)
{
return xt::sum(m)();
}
Run Code Online (Sandbox Code Playgroud)
用于setup.py构建我的Python模块,然后与比较,测试了从np.random.randn不同大小构造的NumPy数组上的求和函数np.sum。
import timeit
def time_each(func_names, sizes):
setup = f'''
import numpy; import xtensor_basics
arr = numpy.random.randn({sizes})
'''
tim = lambda func: min(timeit.Timer(f'{func}(arr)',
setup=setup).repeat(7, 100))
return [tim(func) for func in func_names]
from functools import partial
sizes = [10 ** i for i in range(9)]
funcs = ['numpy.sum',
'xtensor_basics.sum_pyarray',
'xtensor_basics.sum_pytensor']
sum_timer = …Run Code Online (Sandbox Code Playgroud) xtensor ×7
c++ ×4
numpy ×3
bazel ×1
benchmarking ×1
c++14 ×1
caffe ×1
conda ×1
eigen ×1
include-path ×1
performance ×1
python ×1
stdvector ×1