基于std::vector的N维张量

2024-01-18

我想使用 std::vector 定义 n 维数据结构。我对operator()的定义有疑问。让我们看一下二维结构示例

class my_data {

public:
  my_data (size_t N, size_t M) : tab(N*M), _N(N), _M(M) {}

  const double& operator() (size_t i, size_t j) const {
     return tab.at(i * M + j);
  }

  double& operator() (size_t i, size_t j) {
     return tab.at(i * M + j);
  }

private:
   std::vector<double> tab;
   size_t _N;
   size_t _M;

};

我想使用 templates 为任何维度定义这样的结构,但我不知道是否可能。所以基本上我想要的是类似的东西

my_data<4> vec (1,2,3,4);

定义大小为 1,2,3,4 的 4D“张量”(所有元素的数量为 1*2*3*4)。您现在可以通过键入来访问和更改值

vec (0,0,0,0) = 2.0;

以下解决方案使用了一些 C++14 和 C++1z 功能,但它们可以轻松移植到 C++11:

#include <vector>
#include <utility>
#include <array>
#include <cstddef>

namespace detail
{
    template <typename T, typename S>
    class my_data;

    template <typename T, std::size_t... Is>
    class my_data<T, std::index_sequence<Is...>>
    {
    public:
        my_data(decltype(Is)... size)
            : t((size * ...)), s{{ size... }}
        {}

        T& operator()(decltype(Is)... i)
        {            
            return t.at(index({{ i... }}));
        }

        const T& operator()(decltype(Is)... i) const
        {            
            return t.at(index({{ i... }}));
        }

    private:
        std::size_t index(const std::array<std::size_t, sizeof...(Is)>& a) const
        {
            std::size_t ind = a[0];
            for (std::size_t i = 1; i < a.size(); ++i)
            {
                ind = ind * s[i] + a[i];
            }
            return ind;
        }

        std::vector<T> t;
        const std::array<std::size_t, sizeof...(Is)> s;
    };
}

template <typename T, std::size_t N>
using my_data = detail::my_data<T, std::make_index_sequence<N>>;

Test:

int main()
{        
    my_data<double, 4> vec(1,2,3,4);
    vec(0,0,0,0) = 2.0;
}

DEMO http://coliru.stacked-crooked.com/a/6570aca0f11eb2e2

演示(C++11) http://coliru.stacked-crooked.com/a/6688d68b6f1eafa1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于std::vector的N维张量 的相关文章

随机推荐

  • 如何让 MD5 更安全?或者说真的有必要吗?

    我将用户名和密码存储在 MySQL 数据库中 并使用 MD5 对它们进行哈希处理 然而 我只使用标准的 PHP 函数 没有任何修改 现在 我读到 MD5 已损坏 你做得怎么样 您是否通过不同的哈希机制运行多次或添加某种形式的盐 我很惊讶人们
  • 如何在Bootstrap中保持三列之间的空间?

    我在 Stackoverflow 上做了很多关于如何有效解决这个问题的搜索 但我似乎仍然没有找到我正在寻找的东西 基本上 我有三列 我希望它们在页面上均匀分布并居中 然而 当我为所有三列设置 col md 4 时 最终结果是它们全部三列彼此
  • 使用Python删除目录中的所有文件

    我想删除所有具有扩展名的文件 bak在一个目录中 我怎样才能在Python中做到这一点 Via os listdir https docs python org 2 library os html os listdir and os rem
  • getObjectSummaries 能否获取存储在 S3 存储桶中的对象数量?

    我需要知道存储在下面的文件数量S3桶 现在 ObjectListing没有这样的方法count or numberOfObject 但是 它有一个方法将返回一个列表S3ObjectSummary public java util List
  • Intellij IDEA 不在构面列表中显示 Django

    我使用 Fedora 20 和 OpenJDK 1 7 0 60 设置 我可以成功设置并运行 Intellij IDEA 13 1 然后设置 Python 插件 好吧 当我尝试选择性地使用 Python 模块从 Intellij 生成项目时
  • 如何移动SVG在D3中的位置?

    我使用 D3 创建了一个 svg 然而 它只显示在屏幕的左上角 或者被附加到另一个 svg 中 我可以使用 JavaScript 移动它吗 例如 var svg d3 select body append svg attr width 20
  • 在 Linux 中正常构建的 C++ 程序在 VS2010 中编译失败

    我的 C 项目在 Linux 上构建并运行良好 现在我正在尝试在VS2010中编译它 我似乎从 cmath 库中收到许多错误 如下所示 Error 1 error C2061 syntax error identifier acosf c
  • Labview - 通过数组大小限制增加数组索引

    我正在使用labview XY线图 该图使用随机数生成器生成y值 并使用while循环计数生成x值 当达到阈值 x 值 例如 1000 时 我希望能够迭代过去的 1000 个值并仅每 10 个值显示一次 这具有整理绘图的效果 理想情况下 实
  • 如何在 Rust 中计算 21 的阶乘?

    我需要在我的项目中计算 21 的阶乘 fn factorial num u64 gt u64 match num 0 gt 1 1 gt 1 gt factorial num 1 num fn main let x factorial 21
  • 数组中实际上是空白列?

    我在 Google 表格中使用这个公式 SORT SORT Discord D B2 B Discord D A2 A ARRAYFORMULA IF Discord D G2 G IF Discord D C2 C lt gt Remov
  • 系统.ServiceModel.Web .NET Core

    我正在将 NET Framework 应用程序移植到 NET Core 中 我已通过 NuGet System ServiceModel Web 添加 但似乎不起作用 我需要 WebGet 的替代方案 ServiceContract pub
  • 如何拒绝来自 then 函数内部的承诺

    这可能是一个愚蠢的问题 但是在承诺链中 如何拒绝来自 then 函数之一的承诺 例如 someActionThatReturnsAPromise then function resource return modifyResource re
  • Android E/Parcel:解组时未找到类(仅在 Samsung Tab3 上)

    我一直无法解决为什么会出现此错误 并且仅在运行 4 4 2 的 Samsung Tab3 设备上出现 当我的 MainActivity 启动另一个 Activity 并在意图中传递一个 Parcelable 类时 就会发生这种情况 如下所示
  • 避免屏幕旋转后重新创建片段的真正方法(以官方片段开发人员指南为例)

    我正在寻找一种真正的方法来避免屏幕旋转后重新创建片段 if container null return null is not真正避免了片段被重新创建 如下图所示 官方片段开发人员指南在哪里 我们关注的官方指南位于http develope
  • 如何将 Windows 身份验证与 Microsoft.Rest.ServiceClient 结合使用

    我有一个Microsoft Rest ServiceClient生成为autorest 我想访问使用 Windows 身份验证和基本身份验证保护的 REST API 目标是使用 Windows 身份验证 我尝试如下 var handler
  • 如何让 Jaws 读取 aria-descriptedby 属性

    问题如标题中所述 这是我的 HTML 代码 li a href https illinois edu toolbox 0 portlet componentId 13 amp desktopId 1 setup a li div HELLO
  • 在 WSDL 文件中包含架构类型

    我手工创建了一个 WSDL 它只有一个操作 没有输入参数 也没有输出参数 当我尝试从此 WSDL 创建客户端时 出现以下错误 无法导入 wsdl portType 详细信息 运行 WSDL 导入扩展时引发异常 System ServiceM
  • 通过 Android 与串行 USB 设备通信

    我有一台用于测量电流的定制设备 该设备可以连接到 PC 并通过 USB 进行通信 它基于FTDI芯片 我有用 Java 编写的应用程序 该应用程序使用 rxtxSerial dll 库和 gnu io rxtx 2 1 7 4 jar 现在
  • 使用opencv GPU旋转图像

    我在用着GPU 旋转 https docs opencv org 2 4 modules gpu doc image processing html gpu rotate从 opencv lib 顺时针旋转图像 include
  • 基于std::vector的N维张量

    我想使用 std vector 定义 n 维数据结构 我对operator 的定义有疑问 让我们看一下二维结构示例 class my data public my data size t N size t M tab N M N N M M