2017-04-11 208 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的新手,所以我很欣賞這些附加提示。 –