簡體   English   中英

從函數返回am Eigen :: Tensor slice

[英]Return am Eigen::Tensor slice from a function

我想編寫返回Eigen :: Tensor切片的函數。 在實際代碼中,getSlice()接受一些整數,並計算范圍和偏移量。 我希望我的函數將視圖返回到數組中,以便我可以訪問數組以進行讀取和寫入而無需復制。

我可以創建一個作為數組切片的變量並更改數據。 但是,當我從函數返回相同的片段時,值不會改變。 我猜該函數將生成一個新數組作為返回值。 如何退回我需要的切片? 還是我應該采用其他方式?

#include <iostream>
#include <Eigen/Dense>
#include <unsupported/Eigen/CXX11/Tensor>

Eigen::Tensor<float,3> getSlice(Eigen::Tensor<float,3>& a,
                Eigen::array<long,3>& offset,
                Eigen::array<long,3>& extent)
{
   return a.slice(offset,extent);
}

int main()
{
   Eigen::Tensor<float,3> et = Eigen::Tensor<float,3>(3,5,4);
   et.setConstant(1.1);
   std::cout << et << std::endl;

   Eigen::array<long,3> offset = {0,0,0};
   Eigen::array<long,3> extent = {2,2,1};

   et.slice(offset,extent).setConstant(2.2);
   std::cout << "Set slice constant" << std::endl;
   std::cout << et << std::endl;

   auto sl = et.slice(offset,extent);
   sl.setConstant(3.3);
   std::cout << "Set slice constant from slice instance." << std::endl;
   std::cout << et << std::endl;

   getSlice(et,offset,extent).setConstant(4.4);
   std::cout << "Set slice constant from function." << std::endl;
   std::cout << et << std::endl;
}

程序輸出:

$ ./噸

1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1

設置切片常數

2.2 2.2 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 2.2 2.2 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1

從切片實例設置切片常量。

3.3 3.3 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 3.3 3.3 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1

從功能設置切片常數。

3.3 3.3 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 3.3 3.3 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1

您對getSlice的實現返回一個新的Tensor對象(帶有原始數據的副本)的觀察是正確的。 在您的情況下,最簡單的解決方案是將返回類型更改為auto (即使您通常應該對auto和Eigen保持謹慎):

inline auto getSlice(Eigen::Tensor<float,3>& a,
                Eigen::array<long,3>& offset,
                Eigen::array<long,3>& extent)
{
   return a.slice(offset,extent);
}

現場演示: https : //godbolt.org/z/tLWYUz

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM