# Eigen Tensors {#eigen_tensors}
Tensors are multidimensional arrays of elements. Elements are typically scalars,
but more complex types such as strings are also supported.
## Tensor Classes
You can manipulate a tensor with one of the following classes. They all are in
the namespace `::Eigen.`
### Class Tensor<data_type, rank>
This is the class to use to create a tensor and allocate memory for it. The
class is templatized with the tensor datatype, such as float or int, and the
tensor rank. The rank is the number of dimensions, for example rank 2 is a
matrix.
Tensors of this class are resizable. For example, if you assign a tensor of a
different size to a Tensor, that tensor is resized to match its new value.
#### Constructor Tensor<data_type, rank>(size0, size1, ...)
Constructor for a Tensor. The constructor must be passed `rank` integers
indicating the sizes of the instance along each of the the `rank`
dimensions.
// Create a tensor of rank 3 of sizes 2, 3, 4. This tensor owns
// memory to hold 24 floating point values (24 = 2 x 3 x 4).
Tensor<float, 3> t_3d(2, 3, 4);
// Resize t_3d by assigning a tensor of different sizes, but same rank.
t_3d = Tensor<float, 3>(3, 4, 3);
#### Constructor Tensor<data_type, rank>(size_array)
Constructor where the sizes for the constructor are specified as an array of
values instead of an explicitly list of parameters. The array type to use is
`Eigen::array<Eigen::Index>`. The array can be constructed automatically
from an initializer list.
// Create a tensor of strings of rank 2 with sizes 5, 7.
Tensor<string, 2> t_2d({5, 7});
### Class TensorFixedSize<data_type, Sizes<size0, size1, ...>>
Class to use for tensors of fixed size, where the size is known at compile
time. Fixed sized tensors can provide very fast computations because all their
dimensions are known by the compiler. FixedSize tensors are not resizable.
If the total number of elements in a fixed size tensor is small enough the
tensor data is held onto the stack and does not cause heap allocation and free.
// Create a 4 x 3 tensor of floats.
TensorFixedSize<float, Sizes<4, 3>> t_4x3;
### Class TensorMap<Tensor<data_type, rank>>
This is the class to use to create a tensor on top of memory allocated and
owned by another part of your code. It allows to view any piece of allocated
memory as a Tensor. Instances of this class do not own the memory where the
data are stored.
A TensorMap is not resizable because it does not own the memory where its data
are stored.
#### Constructor TensorMap<Tensor<data_type, rank>>(data, size0, size1, ...)
Constructor for a Tensor. The constructor must be passed a pointer to the
storage for the data, and "rank" size attributes. The storage has to be
large enough to hold all the data.
// Map a tensor of ints on top of stack-allocated storage.
int storage[128]; // 2 x 4 x 2 x 8 = 128
TensorMap<Tensor<int, 4>> t_4d(storage, 2, 4, 2, 8);
// The same storage can be viewed as a different tensor.
// You can also pass the sizes as an array.
TensorMap<Tensor<int, 2>> t_2d(storage, 16, 8);
// You can also map fixed-size tensors. Here we get a 1d view of
// the 2d fixed-size tensor.
TensorFixedSize<float, Sizes<4, 3>> t_4x3;
TensorMap<Tensor<float, 1>> t_12(t_4x3.data(), 12);
#### Class TensorRef
See Assigning to a TensorRef below.
## Accessing Tensor Elements
#### <data_type> tensor(index0, index1...)
Return the element at position `(index0, index1...)` in tensor
`tensor`. You must pass as many parameters as the rank of `tensor`.
The expression can be used as an l-value to set the value of the element at the
specified position. The value returned is of the datatype of the tensor.
// Set the value of the element at position (0, 1, 0);
Tensor<float, 3> t_3d(2, 3, 4);
t_3d(0, 1, 0) = 12.0f;
// Initialize all elements to random values.
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
for (int k = 0; k < 4; ++k) {
t_3d(i, j, k) = ...some random value...;
}
}
}
// Print elements of a tensor.
for (int i = 0; i < 2; ++i) {
LOG(INFO) << t_3d(i, 0, 0);
}
## TensorLayout
The tensor library supports 2 layouts: `ColMajor` (the default) and
`RowMajor`. Only the default column major layout is currently fully
supported, and it is therefore not recommended to attempt to use the row major
layout at the moment.
The layout of a tensor is optionally specified as part of its type. If not
specified explicitly column major is assumed.
Tensor<float, 3, ColMajor> col_major; // equivalent to Tensor<float, 3>
TensorMap<Tensor<float, 3, RowMajor> > row_major(data, ...);
All the arguments to an expression must use the same layout. Attempting to mix
different layouts will result in a compilation error.
It is possible to change the layout of a tensor or an expression using the
`swap_layout()` method. Note that this will also reverse the order of the
dimensions.
Tensor<float, 2, ColMajor> col_major(2, 4);
Tensor<float, 2, RowMajor> row_major(2, 4);
Tensor<float, 2> col_major_result = col_major; // ok, layouts match
Tensor<float, 2> col_major_result = row_major; // will not compile
// Simple layout swap
col_major_result = row_major.swap_layout();
eigen_assert(col_major_result.dimension(0) == 4);
eigen_assert(col_major_result.dimension(1) == 2);
// Swap the layout and preserve the order of the dimensions
array<int, 2> shuffle(1, 0);
col_major_result = row_major.swap_layout().shuffle(shuffle);
eigen_assert(col_major_result.dimension(0) == 2);
eigen_assert(col_major_result.dimension(1) == 4);
## Tensor Operations
The Eigen Tensor library provides a vast library of operations on Tensors:
numerical operations such as addition and multiplication, geometry operations
such as slicing and shuffling, etc. These operations are available as methods
of the Tensor classes, and in some cases as operator overloads. For example
the following code computes the elementwise addition of two tensors:
Tensor<float, 3> t1(2, 3, 4);
...set some values in t1...
Tensor<float, 3> t2(2, 3, 4);
...set some values in t2...
// Set t3 to the element wise sum of t1 and t2
Tensor<float, 3> t3 = t1 + t2;
While the code above looks easy enough, it is important to understand that the
expression `t1 + t2` is not actually adding the values of the tensors. The
expression instead constructs a "tensor operator" object of the class
TensorCwiseBinaryOp<scalar_sum>, which has references to the tensors
`t1` and `t2`. This is a small C++ object that knows how to add
`t1` and `t2`. It is only when the value of the expression is assigned
to the tensor `t3` that the addition is actually performed. Technically,
this happens through the overloading of `operator=()` in the Tensor class.
This mechanism for computing tensor expressions allows for lazy evaluation and
optimizations which are what make the tensor library very fast.
Of course, the tensor operators do nest, and the expression `t1 + t2 * 0.3f`
is actually represented with the (approximate) tree of operators:
TensorCwiseBinaryOp<scalar_sum>(t1, TensorCwiseUnaryOp<scalar_mul>(t2, 0.3f))
### Tensor Operations and C++ "auto"
Because Tensor operations create tensor operators, the C++ `auto` keyword
does not have its intuitive meaning. Consider these 2 lines of code:
Tensor<float, 3> t3 = t1 + t2;
auto t4 = t1 + t2;
In the first line we allocate the tensor `t3` and it will contain the
result of the addition of `t1` and `t2`. In the second line, `t4`
is actually the tree of tensor operators that will compute the addition of
`t1` and `t2`. In fact, `t4` is *not* a tensor and you cannot get
the values of its elements:
Tensor<float, 3> t3 = t1 + t2;
cout << t3(0, 0, 0); // OK prints the value of t1(0, 0, 0) + t2(0, 0, 0
没有合适的资源?快使用搜索试试~ 我知道了~
智能体集群控制课程 智能车部分 智能车竞赛
共2000个文件
cpp:814个
h:422个
cmake:126个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 26 浏览量
2024-08-03
21:24:23
上传
评论
收藏 8.32MB ZIP 举报
温馨提示
智能车辆就是在一般车辆上增加了先进的传感器(如雷达、摄像头等)、控制器、执行器等装置,通过车载环境感知系统和信息终端,实现与人、车、路等的信息交换,使车辆具备智能环境感知能力,能够自动分析车辆行驶的安全及危险状态,并使车辆按照人的意愿到达目的地,最终实现替代人来操作的目的的汽车。 总的来说,智能汽车是搭载先进传感系统、决策系统、执行系统,运用信息通信、互联网、大数据、云计算、人工智能等新技术,具有部分或完全自动驾驶功能,由单纯交通运输工具逐步向智能移动空间转变的新一代汽车。 智能汽车技术与一般所说的自动驾驶技术有所不同,它指的是利用多种传感器和智能公路技术实现的汽车自动驾驶。 导航信息资料库 存有全国高速公路、普通公路、城市道路以及各种服务设施(餐饮、旅馆、加油站、景点、停车场)的信息资料的资料库。 GPS定位系统 1. 精确定位车辆所在的位置 2. 与道路资料库中的数据相比较 3. 确定以后的行驶方向。 道路状况信息系统 由交通管理中心提供实时的前方道路状况信息,如堵车、事故等,必要时及时改变行驶路线。 车辆防碰系统 包括探测雷达、信息处理系统、驾驶控制系统,控制与其他车辆的距离,在
资源推荐
资源详情
资源评论
收起资源包目录
智能体集群控制课程 智能车部分 智能车竞赛 (2000个子文件)
AccelerateSupport 2KB
AdolcForward 4KB
AlignedVector3 6KB
COPYING.APACHE 11KB
ArpackSupport 884B
serial_ros-msg.asd 277B
AutoDiff 1KB
local_setup.bash 283B
setup.bash 260B
bench_unrolling 651B
benchmark_suite 1KB
CMakeDetermineCompilerABI_CXX.bin 128KB
CMakeDetermineCompilerABI_C.bin 128KB
CMakeDetermineCompilerABI_CXX.bin 9KB
CMakeDetermineCompilerABI_C.bin 9KB
COPYING.BSD 1KB
Bug 0B
.built_by 11B
BVH 5KB
CMakeCCompilerId.c 25KB
ztbmv.c 19KB
ctbmv.c 19KB
CMakeCCompilerId.c 18KB
zhbmv.c 15KB
chbmv.c 15KB
zhpmv.c 13KB
chpmv.c 13KB
dtbmv.c 11KB
stbmv.c 11KB
ssbmv.c 10KB
dsbmv.c 10KB
dspmv.c 8KB
sspmv.c 8KB
drotmg.c 6KB
srotmg.c 6KB
drotm.c 5KB
srotm.c 5KB
lsame.c 3KB
complexdots.c 2KB
example.c 2KB
feature_tests.c 688B
d_cnjg.c 117B
r_cnjg.c 105B
.catkin 38B
tensor_contract_sycl_bench.cc 11KB
benchmark_main.cc 7KB
tensor_benchmarks_sycl.cc 6KB
tensor_benchmarks_cpu.cc 6KB
contraction_benchmarks_cpu.cc 1KB
cmake.check_cache 85B
Cholesky 1KB
CholmodSupport 2KB
.clang-format 81B
EigenTesting.cmake 27KB
FindPASTIX.cmake 23KB
FindComputeCpp.cmake 16KB
FindPTSCOTCH.cmake 14KB
FindBLASEXT.cmake 13KB
FindSCOTCH.cmake 12KB
FindHWLOC.cmake 11KB
turn_on_qiansheng_robotConfig.cmake 10KB
serial_rosConfig.cmake 9KB
pure_pursuitConfig.cmake 9KB
FindMetis.cmake 9KB
comm_hubConfig.cmake 9KB
cmake_install.cmake 7KB
FindTriSYCL.cmake 5KB
CMakeCXXCompiler.cmake 5KB
FindMPREAL.cmake 3KB
CMakeCXXCompiler.cmake 3KB
EigenConfigureTesting.cmake 3KB
FindFFTW.cmake 3KB
CMakeCCompiler.cmake 3KB
FindMPFR.cmake 3KB
FindStandardMathLibrary.cmake 2KB
FindCHOLMOD.cmake 2KB
EigenSmokeTestList.cmake 2KB
FindPackageHandleStandardArgs.cmake 2KB
FindSuperLU.cmake 2KB
FindCLANG_FORMAT.cmake 2KB
CMakeCCompiler.cmake 2KB
ComputeCppCompilerChecks.cmake 2KB
package.cmake 2KB
FindUMFPACK.cmake 2KB
cmake_install.cmake 1KB
cmake_install.cmake 1KB
MacroOptionalAddSubdirectory.cmake 1KB
FindATLAS.cmake 1KB
FindKLU.cmake 1KB
FindMKL.cmake 1KB
DependInfo.cmake 1KB
EigenUninstall.cmake 1KB
cmake_install.cmake 1KB
FindSPQR.cmake 1KB
FindBlitz.cmake 1KB
DependInfo.cmake 1KB
DependInfo.cmake 926B
FindACML.cmake 918B
RegexUtils.cmake 910B
FindAccelerate.cmake 846B
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
野生的狒狒
- 粉丝: 3371
- 资源: 2436
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功