括号后跟括号

时间:2014-12-12 16:47:50

标签: c++

我试图了解一段C ++代码正在做什么,但对C一无所知。

我有一个这样的循环:

(_A[0])=eigenMatrix::Zero(_n, _n);

for(i=0; i<_n; i++){
    for(j=0; j<=i; j++) (_A[0])(j,i)=(_A[0])(i,j)=value[i*n+j];
}

A是eigenMatrix类型的向量:向量&lt; #eigenMatrix&gt; _A;

我认为第一行是将(_A [0])定义为零n * n矩阵,但我不能解决(_A [0])(j,i)部分正在做什么,并且无法在c ++中找到对这种()()短语的任何引用。

3 个答案:

答案 0 :(得分:3)

运算符重载

在C ++中,您可以重新指定各种运算符的含义。对于Matrix类,定义括号的含义是有意义的:

double & Matrix::operator()(int row, int col) {
    return data[row][col];
}

会产生Matrix对象_A[0],可以从中_A[0](2, 2)获取元素。

左值分配

您的示例中的一个有趣细节是分配给左值 - 您可以看到_A[0](j,i)位于左侧。这样的分配是可能的,因为我们将引用(double &)返回到内部表示data

如果打开为您提供eigenMatrix(或更确切地说是其基类)的头文件,您将找到某些&方法返回的引用(Matrix::operator())的声明

为什么要这么麻烦?

它提供了对矩阵元素的便捷访问,同时提供了比直接简单地暴露内部data更多的控制。例如,您可以想象像

这样的检查
double & Matrix::operator()(int row, int col) {
    assert((row >= 0) && (row < n_row) && (col >=0 ) && (col < n_col));
    return data[row][col];
}

答案 1 :(得分:0)

我不确定_A[0]周围使用了为什么()。
_A[0](i,j)可能只是在第i行和第j列或其他方式返回对值的引用。

Here您可以看到如何使用此运算符:

int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
}

只是为了让每个人都明白你如何申报这样一个对象。

class Matrix
{
private:
float value[4][4];

public:
float& operator()(int i, int j)
{
    return value[i][j];
}
};

答案 2 :(得分:0)

让我们分解这段代码。

所以我们假设这一行:

(_A[0])=eigenMatrix::Zero(_n, _n);

实际上是

A = eigen::Matrix::Zero(_n, _n);

我正在做这个假设,因为

  1. 只访问_A的元素0。
  2. 我想也许你正在使用特征库。
  3. 接下来的部分会更容易一些。

    for(i=0; i<_n; i++){ // Loop from 0 to `_n` which is the size of the Zero Matrix. 
        for(j=0; j<=i; j++) // Loop from 0 to i, this means you are only accessing the
                            // lower left side of the matrix. 
    
                            i=0 -> [j=0, ... No Access
                            i=1 -> [j=0, j=1, ... No Access
                            i=_n -> [j=0, j=1, ... j=_n
    
             (A)(j,i) = (A)(i,j) = value[i*n+j]; 
    

    第一部分是多余的,你要分配给自己。

    第二部分(= value [...])将当前查看的矩阵元素分配给相同的元素,但是在存储为名为value的1D向量的2D数组中。 }