我正在使用 Torch C++ 前端并希望在其中包含一个具有指定值的张量。为了实现这一点,可以手动分配内存并设置值,然后使用torch::from_blob在内存块上构建张量,但对我来说似乎不够干净。
在这个文档的最底部我发现我可以使用下标直接访问和修改数据。然而,这种方法有很大的运行时间开销,可能是因为下标访问会将张量的元素视为 0-d 张量。以下代码在我的机器上会花费超过 2 秒(-O3优化级别),这对于现代 CPU 来说太长了。
torch::Tensor tensor = torch::empty({1000, 1000});
for(int i=0; i < 1000; i++)
{
for(int j=0 ; j < 1000; j++)
{
tensor[i][j] = calc_tensor_data(i,j);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有干净快速的方法来实现这个目标?
在我的项目中,编译器抱怨以下(以及许多其他类似的)代码片段:
Eigen::ArrayXf window =
Eigen::ArrayXf::LinSpaced(2*M + 1, 0, M_PI)
.head(2*M)
.sin();
Run Code Online (Sandbox Code Playgroud)
警告信息很长且无法阅读,所以我不会在这里发布所有内容。触发的警告是-Wdeprecated-copy,警告消息的核心部分(在我看来)如下
warning: implicitly-declared ‘Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>::Block(const Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>&)’ is deprecated [-Wdeprecated-copy]
note: because ‘Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>’ has user-provided ‘Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>& Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>::operator=(const Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>&) [with XprType = const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, …Run Code Online (Sandbox Code Playgroud) int c = 2;
int d = std::move(c);
std::cout << "c is: " << c << std::endl;
std::cout << "d is: " << d << std::endl;
Run Code Online (Sandbox Code Playgroud)
此代码输出:
c是:2
d 是:2
我认为在 move(c) 到 d 之后,c 将是空的,为什么它的值仍然是 2?你能帮我解释一下吗?谢谢你。