【问题标题】:C++ iterators - Deduce dimensionalityC++ 迭代器 - 推断维度
【发布时间】:2014-04-30 19:03:03
【问题描述】:

我正在计算矩阵的行列式,计算结果会根据数据的维度调用一个方法,例如:

template<int X, int Y>
float determinant(X, Y, std::vector<Vector> &data)
{
    // Determine the dimensionality of matrix data (x and y) 
}

我遇到的问题是,在调用此函数的计算 PCA 的类中,只接受一个迭代器:

class PCA { 

   public: 

      template<typename T> 
      PCA(T begin, T end)
      {
          // Determine the X and Y here
          float det = determinant(X, Y, ....); 
      }
}; 

现在我想知道是否可以从通过 PCA 的迭代器中推断出 XY,而不是传入两个整数值。

任何建议将不胜感激

编辑:

抱歉,我的问题不清楚。

基本上,typedef std::vector&lt;double&gt; Vector; 被使用,因此 std::vector&lt;Vector&gt; data; 将因此是向量的向量。

我通过以下方式对其进行采样:

std::vector&lt;Vector&gt; data1 = { {1, 2}, {3, 4}, {5, 6}, {8, 9} }; // 2x2 而当我想添加以下内容时:std::vector&lt;Vector&gt; data2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} }; // 3x3 很明显,在计算行列式时,对此有不同的计算。

我想从函数中推断出 data1 是 2x2 和 data2 3x3,而不必专门传入这些值。

【问题讨论】:

  • 如果您需要任何帮助,您需要发布该迭代器的代码。
  • 你在寻找 'std::iterator_traits' 吗?
  • 我不确定我是否遵循。如果您所拥有的只是元素的数量(来自end - begin),那么会有很多尺寸适合,不是吗?除非迭代器是某种特殊的迭代器,可以以某种方式访问​​维度?
  • @user1326876:您能否展示示例用法,从一对迭代器创建 PCA,我们可以看到您在谈论什么维度? Vector 是什么? std::vector&lt;Vector&gt; 本身是否代表一个二维数组,或者它是一个维度,而 Vector 是另一个维度,或者每个 Vector 是一个二维数组?还是涉及到 3d 数组?
  • @user1326876 我不确定 8 个元素如何组成一个 2x2 矩阵.. 但顺便说一下,你可能(如果你有所有方阵)用 vector::size 计算元素的数量()

标签: c++ iterator


【解决方案1】:

由于向量不是固定大小的,它们可能是锯齿状的。 (与此对比,例如 std::array&lt;&gt;T [N][M][L];您可以在编译时推断它们的等级)。

假设他们不是:看看 Live On Coliru

#include <vector>
#include <cstdint>
#include <deque>

template <typename V>
    std::deque<std::size_t> dims_of(V const& v) {
    return {};
}

template <typename T>
    std::deque<std::size_t> dims_of(std::vector<T> const& v)
{
    if (v.empty())
        return { 0 };
    else
    {
        auto dims = dims_of(v.front());
        dims.push_front(v.size());
        return dims;
    }
}

#include <iostream>

int main()
{
    std::vector<std::vector<std::vector<int> > > const
        v(7, std::vector<std::vector<int> >(
            10, std::vector<int>(3, 0)
            )
         );

    for (auto dim : dims_of(v))
        std::cout << dim << " ";

} 

打印

7 10 3 

【讨论】:

  • 我喜欢这种方法,真的,我喜欢。我主要关心的是这会进入“PCA”类还是进入命名空间“Determinant”?
  • 两者都可以做 AFAICS。它实际上只是一个实用函数,所以它可以在 Determinant::details 命名空间中,例如
  • 刚刚意识到,我不能将这两个模板参数传递给我吗?它们不是常数
  • 不能在编译时推断运行时信息。这不可能。因此,只要您使用向量,就没有办法。除非您以其他方式简单地对尺寸进行硬编码。也许是时候参加 SSCCE meta.stackexchange.com/questions/22754/…
  • 我只是要对其进行硬编码,因为这个库只能处理 2 或 3 个维度。不过感谢您的回答!
【解决方案2】:

如何从 PCA 派生到包含 X 和 Y 的类

template<int X,int Y>
PCA_size : public PCA
{
      enum { Xv=X};
      enum { Yv=Y};

}

然后您可以将现有的 PCA 对象重铸到您的对象中

 static_cast<PCA_size<3,5> >(PCA_instance);

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 2014-03-27
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2014-04-20
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多