获取由向量组成的矩阵表示的矩阵的第一列

2023-12-11

假设我代表一个矩阵foo值使用std::vector:

int rows = 5;
int cols = 10;    
auto foo = vector<vector<double>>(rows, vector<double>(cols));

有没有一种巧妙简单的方法让我获得vector<int>尺寸的rows包含 foo 的第一“列”:

{foo[0][0], foo[0][1], foo[0][2], foo[0][3], foo[0][4] }

换句话说,我可以“转置” foo 以使以下三件事为真:

foo_transpose.size() == cols
foo_transpose[0].size() == rows
foo_transpose[0] == {foo[0][0], foo[0][1], foo[0][2], foo[0][3], foo[0][4] }

澄清说明

对于表示“矩阵”的替代方法有一些很好的建议。当我使用术语“矩阵”时,我只是指第二级中的每个vector的大小相同。我并不是说我将使用这种数据结构进行线性代数类型运算。我实际上确实需要一个向量的向量,或者一个可以从中“提取”一维向量的数据结构,因为我有对向量进行操作的函数,例如:

double sum(vector<double> const & v);

我通过以下方式调用:

sum(foo[0]);

只是在特殊情况下我遇到了需要做的情况:

sum({foo[0][0], foo[0][1], foo[0][2], foo[0][3], foo[0][4] };

For循环解决方案

有一个明显的 for 循环解决方案,但我一直在寻找更强大、更高效的解决方案。


正如我在评论中提到的,由于以下几个原因,使用向量的向量表示矩阵是不切实际的:

  1. 设置起来很繁琐;
  2. 改变很难;
  3. 缓存局部性不好。

这是我创建的一个非常简单的类,它将在单个向量中保存一个二维矩阵。这几乎就是 MATLAB 之类的软件的做法……尽管进行了巨大的简化。

template <class T>
class SimpleMatrix
{
public:
    SimpleMatrix( int rows, int cols, const T& initVal = T() );

    // Size and structure
    int NumRows() const                       { return m_rows; }
    int NumColumns() const                    { return m_cols; }
    int NumElements() const                   { return m_data.size(); }

    // Direct vector access and indexing
    operator const vector<T>& () const        { return m_data; }
    int Index( int row, int col ) const       { return row * m_cols + col; }

    // Get a single value
          T & Value( int row, int col )       { return m_data[Index(row,col)]; }
    const T & Value( int row, int col ) const { return m_data[Index(row,col)]; }
          T & operator[]( size_t idx )        { return m_data[idx]; }
    const T & operator[]( size_t idx ) const  { return m_data[idx]; }

    // Simple row or column slices
    vector<T> Row( int row, int colBegin = 0, int colEnd = -1 ) const;
    vector<T> Column( int col, int rowBegin = 0, int rowEnd = -1 ) const;

private:
    vector<T> StridedSlice( int start, int length, int stride ) const;

    int m_rows;
    int m_cols;

    vector<T> m_data;
};

这个类基本上是围绕一个函数进行糖衣——StridedSlice。其实现是:

template <class T>
vector<T> SimpleMatrix<T>::StridedSlice( int start, int length, int stride ) const
{
    vector<T> result;
    result.reserve( length );
    const T *pos = &m_data[start];
    for( int i = 0; i < length; i++ ) {
        result.push_back(*pos);
        pos += stride;
    }
    return result;
}

其余的就非常简单了:

template <class T>
SimpleMatrix<T>::SimpleMatrix( int rows, int cols, const T& initVal )
    : m_data( rows * cols, initVal )
    , m_rows( rows )
    , m_cols( cols )
{    
}

template <class T>
vector<T> SimpleMatrix<T>::Row( int row, int colBegin, int colEnd ) const
{
    if( colEnd < 0 ) colEnd = m_cols-1;
    if( colBegin <= colEnd )
        return StridedSlice( Index(row,colBegin), colEnd-colBegin+1, 1 );
    else
        return StridedSlice( Index(row,colBegin), colBegin-colEnd+1, -1 );
}
    
template <class T>
vector<T> SimpleMatrix<T>::Column( int col, int rowBegin, int rowEnd ) const
{
    if( rowEnd < 0 ) rowEnd = m_rows-1;
    if( rowBegin <= rowEnd )
        return StridedSlice( Index(rowBegin,col), rowEnd-rowBegin+1, m_cols );
    else
        return StridedSlice( Index(rowBegin,col), rowBegin-rowEnd+1, -m_cols );
}

请注意,Row and Column函数的设置方式使您可以轻松请求整行或整列,但功能更强大,因为您可以通过传递一个或两个以上参数来分割范围。是的,您可以通过使起始值大于最终值来反向返回行/列。

这些函数中没有内置边界检查,但您可以轻松添加它。

您还可以添加一些内容以将区域切片返回为另一个区域切片SimpleMatrix<T>.

玩得开心。

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

获取由向量组成的矩阵表示的矩阵的第一列 的相关文章

随机推荐

  • 什么是最小有效 UNC 路径?

    我想创建一个 除其他外 解析 UNC 路径的库 但我不完全理解语法 常见的例子是 server share path 有效的文件路径需要所有这些吗 我可以导航到 server 没有share 使用 Windows 资源管理器 但我假设它使用
  • 我们如何使用 Windows 身份验证保护 Swagger UI

    我们有一个 Net Core 2 2 Web Api 它使用 swagger ui 来公开 Web Api 定义 我们希望仅向特定 AD 组内的用户保护此端点 我们目前使用 Windows 和匿名身份验证 问题是我们无法强制 Swagger
  • 为什么函数参数中的逆变类型参数被视为处于“out”位置?

    我很难用英语描述 但问题是 class Consumer
  • 如何将多边形绑定到 WPF 中现有的 PointCollection?

    我当前的实现不会在表单上显示任何内容 即使我认为有界的集合有数据 我在调试中检查 这是一些代码 public event PropertyChangedEventHandler PropertyChanged PointCollection
  • 使用 Dart/Flutter 查询包含 Cloud Firestore 中保存的 ID 的地图

    如何使用 Dart Flutter 获取存储在 Cloud Firestore 中的地图 我尝试过这个 但它只适用于 Array Firestore instance collection posts orderBy createdAt d
  • 我应该如何更新过时的 fork?

    几个月前 我分叉了一个存储库 进行了更改并提交了拉取请求 该请求最终被 master 接受 从那以后 我的分叉代码在我的硬盘上就没有受到任何影响 现在 我想再次为同一个存储库做出贡献 我的 fork 中的代码与 master 不同步 因为它
  • ADB服务器无法启动android

    我已经安装了 adt 捆绑包 eclipse 但是 我似乎无法运行 AVD 我有问题 ADB server didn t ACK failed to start daemon 我已经搜索了如何解决它 我已经阅读并输入adb kill ser
  • 将 Excel 导入 Panda Dataframe

    以下只是 Coursera 数据科学作业的开始 我希望这不是一件小事 但我对此迷失了方向 找不到答案 我被要求将 Excelfile 导入 panda 数据框并随后对其进行操作 该文件可以在这里找到 http unstats un org
  • Makefile 的运行方式与 shell 命令不同? (使用猫时)

    我正在尝试将手动运行的命令转换为 Makefile 目标 但出现与我的使用相关的错误cat 我想我正在尝试打开文件 cat 而不是cat ing 实际文件 queries sql clean ls sql sql sort V while
  • 捕获所选 UI 菜单选项的名称

    我正在尝试将条目添加到 Google 表格的菜单中 ui createMenu Push to Sheet addItem Texas menuItem addItem Illinois menuItem addToUi 在回调函数中men
  • 新日期的日期无效("YYYY-MM-DDThh:mm:ss");实例化

    我正在使用 Titan 它是一个基于 JavaScript 的移动开发框架 我有一个数组 其中的单元格中包含一个表示 YYYY MM DD HH mm ss 格式的 日期和时间 字符串的字符串 NightsArray i 3 返回 2014
  • Hibernate 5 序列生成问题

    我正在从 3 迁移到 hibernate 5 我发现序列生成器在 Hibernate 5 中无法正常工作 我用最小值 1000 定义了序列并递增 1 但是当我尝试创建新的实体记录时 我看到插入的记录的 id 为 951 看起来 id 与实际
  • 将列表编组为 XML 是可行的 - 但如何解组呢?

    我可以使用 Wrapper 类来编组 ObservableList 如下所示 但我无法将其解组回之前的包装类 这个想法是 我有一个 费用 的可观察列表 我将此列表放入包装类中 并将该类保存为 XML 结果如下
  • FCM 主题限制以及旧的未使用主题的过期/失效?

    我使用 FCM 主题已经有一段时间了 但文档非常有限 大多数搜索都会指向相同的页面 所以我在这里询问 希望有人在该主题上有足够的经验来回答我的问题 我想知道允许的主题数量是否有限制以及不再使用的主题会怎样 我的意思是 什么时候主题会无效 我
  • IBM Worklight 6.1 - 项目无法初始化,因为项目数据库模式来自 N/A 版本

    当我尝试将 war 文件部署到应用程序服务器时 收到以下错误消息 错误 500 javax servlet ServletException Worklight 控制台 初始化失败 记录的异常 java lang RuntimeExcept
  • strsplit 和 lapply

    我在表单的某些文本中有一个字符串 12 34 77 包括引号 我需要将每个数字的值放入列表中 我尝试使用lapply and strsplit control2 lapply strsplit data values as numeric
  • 从 aria-label selenium webdriver 中提取文本 (python)

    现在我正在开发一个程序 该程序接受用户输入的问题和答案 将它们分成单独的 q 和 a 列表 然后根据问题或答案自动回答问题 由于使用 机器人 的地方是在线的 我使用的是 Selenium Web 驱动程序 这在尝试读取 aria 标签时给我
  • 是否可以使用图像代替 SVG 路径的笔画?

    首先 我知道这个问题是very如同this问题 但我尝试用一 个来实现该解决方案SVG PATH但它不起作用 我还知道另一种解决方案是循环PATH并设置FILL of the PATH如上所述here以及网络上的其他地方 不过 我已经动画化
  • 在 Angularjs 中使用 GeoChart

    如何在 Angular 中使用 Google GeoChart 我想在 geoChart 中注入角度数据 就像 Javascript 中的示例一样https developers google com chart interactive d
  • 获取由向量组成的矩阵表示的矩阵的第一列

    假设我代表一个矩阵foo值使用std vector int rows 5 int cols 10 auto foo vector