我试图了解一段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 ++中找到对这种()()短语的任何引用。
答案 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);
我正在做这个假设,因为
_A
的元素0。 接下来的部分会更容易一些。
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数组中。
}