VectorXd my_vector;
MatrixXd my_matrix;
和尺寸都在表達波紋管兼容。
我記得在本徵文檔,它始終是更好地計算表達式作爲一個整體,而不是評估小chuncks,然後重新組合的結果,因爲它給了本徵更多的機會進行優化。
考慮到這一點,我將使用:
// (1)
int index;
(my_vector.transpose() * my_matrix.leftCols(n_cols+1)).maxCoeff(&index);
而非:
// (2)
int index;
RowVectorXd temp = my_vector.transpose() * my_matrix.leftCols(n_cols+1);
temp.maxCoeff(&index);
然而,當同時使用n_cols
= 1(1)崩潰(2)代替(1)準確地在同一個地方似乎總是工作。 (請注意,my_matrix
有超過1列...)
問題:
爲什麼(1)在(2)不會崩潰?
如何防止(1)在保持單一表達式的同時崩潰?
錯誤來自Eigen的內部機器斷言,在我看來,這是因爲在(1)maxCoeff
似乎並沒有意識到它被稱爲行矢量而不是一般矩陣 - 請糾正我,如果我錯了。
這是否只保存一行代碼或它也允許Eigen優化整個計算?我不知道Eigen是否真的這樣做,但我會想象一個完全優化的計算只會循環一次,而也許'eval()'會強制第一個循環,然後'maxCoeff'將不得不運行第二個循環循環? – Julien
這是正確的。 'eval()'強制在內存中保存一個臨時內存,隨後運行'maxCoeff'。 –
感謝您的額外解釋。對於TLDR:我必須使用我公司的版本,並且他們不會轉換爲alpha版本...對於更詳細的解釋,我有點失去它,特別是我不明白背後的原因只有一列......這只是一個真正的'錯誤',是要在下一個版本中解決的? – Julien