【问题标题】:Implementing Matlab's colon : operator in C++ expression templates class实现 Matlab 的冒号:C++ 表达式模板类中的运算符
【发布时间】:2013-05-02 13:25:00
【问题描述】:

我正在实现一个 C++ 表达式模板库。我已经设置了一个适当的SubMatrixExpr 类来收集矩阵中的元素,从而启用类似

的语法
B = SubMatrix(A,1,3,2,10);

相当于Matlab的

B = A(1:3,2:10);

当然,Matlab 的语法比我的要舒服得多。所以我的问题是

有没有可能在 C++ 中设置 Matlab 的冒号: 运算符?

提前非常感谢您。

【问题讨论】:

  • 没有。 C++ 中没有冒号运算符。但是,您可以重载其他一些运算符来执行此操作。
  • 您将无法获得您在 Matlab 中的确切语法,但您可以通过重载 Matrix 类的 operator() 来更接近,这样它就可以将两个范围作为操作数。然后您就可以编写B = A(range(1,3), range(2,10)),它可能SubMatrix 版本更具可读性。
  • @LucTouraille 对range() 部分的良好提示,我现在将其放入我的答案中。谢谢。
  • @LucTouraille 谢谢。您实施Range 的建议对我来说非常有效。

标签: c++ expression metaprogramming


【解决方案1】:

简短的回答:不。 冒号不是有效的 C++ 运算符,因此不能重载。如果可以的话,它仍然不可能轻松地实现你所需要的,因为它肯定会优先于逗号运算符,这会使你的表达式在A((1:3),(2:10)) 的行中,并且你只被允许如果操作数之一是用户定义的类型,则重载运算符(此处不是这种情况)。

因此,即使使用任何其他运算符,您也无法执行任何看起来像这样的操作。

可以做什么:为您的矩阵类重载operator(),以获得合理的参数。如果你定义了operator()(int,int, int, int);,这可以让你写出类似B = A(1,3,2,10);的东西

我的首选解决方案是 operator() 在 C++11 中采用两个 initializer_lists 或两个 std::array<int,2>。前者必须检查列表是否正好包含两个元素,后者需要一个笨拙的双括号进行初始化 - 这可能会在 C++14 或更高版本中消失(N3526,但 afaik 它不在 C++14 的 CD 中)。第三种可能性当然是您可以调用的命名类,并显示一个范围:

class Matrix {
  /* ... */
public:
  Matrix operator()(std::initializer_list<int> range1, std::initializer_list<int> range2);
  //or:
  Matrix operator()(std::array<int,2> range1, std::array<int,2> range2);
  //or:
  Matrix operator()(Range range1, Range range2);

};

int main() {
  Matrix A;
  /* ... */
  Matrix B = A({1,3}, {2,10}); //beware of A({1,3,2,4,5}, {0}) !
  //or:
  Matrix B = A({{1,3}}, {{2,10}}); //uhgs...
  //or:
  Matrix B = A(Range(1,3), Range(2,10)); //more verbose, but also more understandable
}

【讨论】:

  • 谢谢。 Luc Touraille 对Range 的建议非常适合我。
【解决方案2】:

另一个想法是在构造函数char * 中设置参数的类型,然后在构造函数内部解析出: 中的数字。例如,

A = B("3:4","8:end");

A = B(":","2");

这允许您做更多事情,例如使用 end 关键字。

【讨论】:

  • 但是效率会很低,因为你需要解析字符串,而char* 对字符串来说是个坏主意,因为你事先不知道长度
猜你喜欢
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多