运行UmfPackLU<>时的Appcrash与特征库

时间:2016-08-02 13:53:05

标签: c++ linear-algebra eigen umfpack

我正在编译并尝试在Private Sub crearRibbon() Dim RibbonXml As DOMDocument60 Dim objRaizElem As IXMLDOMElement Dim objRibbonElem As IXMLDOMElement Dim objPestana As IXMLDOMElement Dim objPestanas As IXMLDOMElement Dim objGrupo As IXMLDOMElement Dim objControl As IXMLDOMElement Dim objRaizAtt As IXMLDOMAttribute Dim objRibbonAtt As IXMLDOMAttribute Dim objPestanaAtt As IXMLDOMAttribute Dim objGrupoAtt As IXMLDOMAttribute Dim objControlAtt As IXMLDOMAttribute Dim strRibbon As String Set RibbonXml = New DOMDocument60 'Raiz Set objRaizElem = RibbonXml.createNode(1, "customUI", "http://schemas.microsoft.com/office/2006/01/customui") RibbonXml.appendChild objRaizElem 'Ribbon Set objRibbonElem = RibbonXml.createNode(1, "ribbons", "http://schemas.microsoft.com/office/2006/01/customui") objRaizElem.appendChild objRibbonElem Set objRibbonAtt = RibbonXml.createAttribute("startFromScratch") objRibbonAtt.Text = ("True") objRibbonElem.setAttributeNode objRibbonAtt 'Pestaña Set objPestana = RibbonXml.createNode(1, "tabs", "http://schemas.microsoft.com/office/2006/01/customui") objRibbonElem.appendChild objPestana 'Pestañas Set objPestanas = RibbonXml.createNode(1, "tab", "http://schemas.microsoft.com/office/2006/01/customui") Set objPestanas = RibbonXml.createElement("tab") objPestana.appendChild objPestanas Set objPestanaAtt = RibbonXml.createAttribute("id") objPestanaAtt.Text = ("1") objPestanas.setAttributeNode objPestanaAtt Set objPestanaAtt = RibbonXml.createAttribute("label") objPestanaAtt.Text = ("A Custom Tab") objPestanas.setAttributeNode objPestanaAtt Set objPestanaAtt = RibbonXml.createAttribute("visible") objPestanaAtt.Text = ("true") objPestanas.setAttributeNode objPestanaAtt 'Grupos Set objGrupo = RibbonXml.createNode(1, "group", "http://schemas.microsoft.com/office/2006/01/customui") 'Set objGrupo = RibbonXml.createElement("group") objPestanas.appendChild objGrupo Set objGrupoAtt = RibbonXml.createAttribute("id") objGrupoAtt.Text = ("dbCustomGroup") objGrupo.setAttributeNode objGrupoAtt Set objGrupoAtt = RibbonXml.createAttribute("label") objGrupoAtt.Text = ("A Custom Group") objGrupo.setAttributeNode objGrupoAtt 'Control Set objControl = RibbonXml.createNode(1, "control", "http://schemas.microsoft.com/office/2006/01/customui") 'Set objControl = RibbonXml.createElement("control") objGrupo.appendChild objControl Set objControlAtt = RibbonXml.createAttribute("idMso") objControlAtt.Text = ("Paste") objControl.setAttributeNode objControlAtt Set objControlAtt = RibbonXml.createAttribute("label") objControlAtt.Text = ("Built-in Paste") objControl.setAttributeNode objControlAtt Set objControlAtt = RibbonXml.createAttribute("enabled") objControlAtt.Text = ("true") objControl.setAttributeNode objControlAtt RibbonXml.Save ("miRibbon1.xml") 平台上使用UMfPackLU<SparseMatrix<>>Eigen 3.2.9UMFPACK v4.5库运行TDM-GCC 5.1.0例程。但我正在Win64获得Appcrash

我需要实现的目标如下:

exception code c0000005

我在做什么(仅摘录)如下:

     _ _        _ _
A = | P |, B = | R |, where P and Q are sparse and Z is 0 with 3 cols
    | Q |      | Z |
    |_ _|      |_ _|

X = A\B;

请注意#define num_t double ... SparseMatrix<num_t,RowMajor> A(P.rows()+Q.rows(), P.cols()); A.topRows(P.rows()) = P; A.bottomRows(Q.rows()) = Q; Matrix<num_t, Dynamic, 3> B(P.rows()+Q.rows(), 3); B.topLeftCorner(P.rows(), 3) = R; B.bottomLeftCorner(Q.rows(), 3) = S; UmfPackLU<SparseMatrix<num_t>> solver(A.transpose()*A); auto AtB = A.transpose()*B; X.col(0) = solver.solve(AtB.col(0)); // @@@ segmentation error here @@@ X.col(1) = solver.solve(AtB.col(1)); X.col(2) = solver.solve(AtB.col(2)); 采用SparseMatrix<>格式。

在使用RowMajor进行调试时:我在标记为上述行的行中获得gdb

而不是Program received signal SIGSEGV, Segmentation fault.,使用UmfPackLU<SparseMatrix<>>解决,SimplicialLLT<SparseMatrix<>>SimplicialLDLT<SparseMatrix<>>工作正常。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这是Eigen 3.2.9的一个缺点,已经在3.3分支中修复了。它现在也在3.2分支中修改(changeset 1e7d97fea51d)。

您可以通过调用compute(...)而不是构造函数来解决此问题:

UmfPackLU<SparseMatrix<num_t>> solver;
solver.compute(A.transpose()*A);

答案 1 :(得分:0)

请随时纠正/加强/确定我的答案。

我发现,我需要实例化一个明确的ColMajor矩阵AtA,然后再将其提供给求解器(RowMajor不起作用),如下所示:

SparseMatrix<num_t, ColMajor> AtA = A.transpose()*A;
UmfPackLU<SparseMatrix<num_t>> solver(AtA);

由于调用Eigen的{​​{1}} lazy evaluation实施,这是否是一项要求?