【问题标题】:Parentheses followed by parentheses括号后面是括号
【发布时间】:2014-12-12 16:47:49
【问题描述】:

我试图了解一段 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类型的向量:vector _A;

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

【问题讨论】:

  • 没有看到_A的定义就不能告诉你任何事情。
  • 我推测括号运算符的重载以将值分配给矩阵的元素。
  • C++ != C,顺便说一句,所以缺乏 C 知识并不一定意味着什么。如果_A 是一个类对象数组,那么该类可能实现operator(),它允许函数样式调用。否则它可能是一个函数指针数组。
  • 在 C 中,唯一可行的方法几乎肯定是不是你的 C++ 代码正在做什么,所以我冒昧地将它从标签中删除并你的主题。
  • 谢谢你——正如我所说,C++ 中的白痴

标签: c++


【解决方案1】:

运算符重载

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

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

将产生一个Matrix 对象_A[0],可以从其中获取元素,如_A[0](2, 2)

左值赋值

您的示例中一个有趣的细节是对 lvalue 的赋值——您可以看到 _A[0](j,i) 在左侧。这样的分配是可能的,因为我们返回了一个对内部表示 data 的引用 (double &amp;)。

如果您打开为您提供eigenMatrix(或者更确切地说是它的基类)的头文件,您会发现某个Matrix::operator() 方法返回的引用声明(&amp;)。

何必呢?

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

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

【讨论】:

  • 谢谢您 - 查看头文件,eigenMatrix 是根据上下文从 Eigen/Dense 重新定义 MatrixXf 或 MatrixXd
【解决方案2】:

我不确定为什么在 _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];
}
};

【讨论】:

    【解决方案3】:

    让我们分解这段代码。

    所以让我们假设这一行:

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

    其实是

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

    我做出这个假设是因为

    1. 只有_A 的元素0 被访问过。
    2. 我想您可能正在使用特征库。

    接下来的部分会简单一些。

    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[...]) 将当前查看的矩阵元素分配给相同的元素,但在一个二维数组中,该数组存储为名为@9​​87654325@ 的一维向量。 }

    【讨论】:

    • 这很有用,但我应该指出这只是代码的一个sn-p,稍后会调用A的其他值,例如as _A[2]=eigenMatrix::Identity(_n, _n)
    猜你喜欢
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多