2017-04-11 267 views
0

我试图实现使用征以下贝塞尔曲线度仰角方程库:乘以(n×m个)矩阵系数a(NX 1)矩阵明智

enter image description here

下面的代码段是工作来计算新的控制点。在这个代码中,degree是来自等式的变量n

const size_t dimension = 3; // 2d or 3d points 
const size_t degree = 3; 
const size_t order = degree + 1; 

// Create and fill Eigen::Matrix with original control points 
Eigen::Matrix<double, order, dimension> P; 

    // Fill matrix with original control points. Should be degree + 1 points. 

// Calculate the new control points 
Eigen::Matrix<double, degree, 1> M1 = FillElevationMatrix<double, degree>(); 
Eigen::Matrix<double, degree, 1> M2; 
M2.setOnes(); 
M2 -= M1; 
Eigen::Matrix<double, degree, dimension> Q; 
for (size_t i = 0; i < degree; ++i) { 
    Q.block(i, 0, 1, dimension) = (M1.row(i) * P.row(i)) + (M2.row(i) * P.row(i + 1)); 
} 

是否有一种方法可以消除循环并一次完成计算?或者更一般地说,如何将一列标量(n x 1矩阵)乘以一个n x m矩阵,以便在一次操作中第一个矩阵的相应行乘以第二个矩阵中相应行的每个元素?。循环一次只做一行。我想是这样的:

Q = (M1 * P.block(0, 0, degree, dimension)) + (M2 * P.block(1, 0, degree, dimension));

回答

2

你的循环对应于对角线martrices相乘,即:

Q = M1.asDiagonal() * P.topRows<degree>() + M2.asDiagonal() * P.bottomRows<degree>(); 

为了初始化M1M2,也看看LinSpacedreverse

+0

正是我所希望的和更多!我是Eigen的新手,所以我很欣赏这些附加提示。 –