public SparseMatrix Product(SparseMatrix SeccondMatrix) { RowHeadNode MatrixARow = this.StartRowHeadNode; ColumnHeadNode MatrixBColumn = SeccondMatrix.StartColumnHeadNode; SparseMatrix ReturnMatrix = new SparseMatrix(this.FixedNumRows, SeccondMatrix.FixedNumColumns); do { ValueNode NodeA = MatrixARow.GetFirst(); ValueNode NodeB = MatrixBColumn.GetFirst(); do { if (NodeA == null || NodeB == null) { break; } if (NodeA.Column > NodeB.Row) { NodeB = (ValueNode)NodeB.NextInRow; } if (NodeA.Column < NodeB.Row) { NodeA = (ValueNode)NodeA.NextInColumn; } if (NodeA.Column == NodeB.Row) { ReturnMatrix.Insert(NodeA.Column, NodeA.Row, (NodeA.Value * NodeB.Value)); NodeB = (ValueNode)NodeB.NextInRow; NodeA = (ValueNode)NodeA.NextInColumn; } }while (NodeA != MatrixARow.GetFirst() && NodeB != MatrixBColumn.GetFirst()); MatrixARow = (RowHeadNode)MatrixARow.GetNext(); MatrixBColumn = (ColumnHeadNode)MatrixBColumn.GetNext(); }while (MatrixARow != this.StartRowHeadNode && MatrixBColumn != SeccondMatrix.StartColumnHeadNode); return(ReturnMatrix); }