将(n×1)矩阵乘以(n×m)矩阵系数

时间:2017-04-11 23:38:02

标签: matrix eigen

我正在尝试使用 Eigen 库实现以下Bézier曲线度高程方程:

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));
}

有没有办法消除循环并一次性完成计算?或者,更一般地说,如何将一列标量(nx 1矩阵)乘以焦虑矩阵,以便在一次操作中只将第一个矩阵的相应行乘以第二个矩阵中相应行的每个元素吗。循环一次一行。我想要的是这样的:

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

1 个答案:

答案 0 :(得分:2)

你的循环对应于与对角线的数量相乘,即:

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

有关初始化M1M2的信息,请查看LinSpacedreverse