         return grid
     }
     
+    public func generateElements<A>(from basis: [A]) -> [FreeModule<A, R>] {
+        assert(basis.count <= rows)
+        
+        switchAlignment(.Cols)
+        
+        return (0 ..< cols).map { j -> FreeModule<A, R> in
+            guard let v = table[j] else {
+                return FreeModule.zero
+            }
+            return FreeModule( v.map{ (i, r) in (basis[i], r)} )
+        }
+    }
+    
     public var asMatrix: DynamicMatrix<R> {
         return DynamicMatrix(rows: rows, cols: cols, grid: generateGrid())
     }
     
     public var description: String {
-        return "CMatrix(\(align), \(align == .Rows ? table.sum{ $0.1.count } : table.sum{ $0.1.count } ))"
+        return "CMatrix(\(rows), \(cols); \(table.sum{ $0.1.count }) elements)"
     }
     
     public var detailDescription: String {
-        return description + "\n" + asMatrix.detailDescription
+        return description + " [ " + table.flatMap { (i, list) in
+            list.map{ (j, a) in "\( align == .Rows ? (i, j, a) : (j, i, a) )"}
+            }.joined(separator: ", ") + " ]"
     }
 }

        case .Rows:
            for (i, list) in table {
                for (j, a) in list {
                    grid[i * cols + j] = a
                }
            }

        }
    }
    
    @_specialize(where R == IntegerNumber)
    public static func ==(a: ComputationalMatrix<R>, b: ComputationalMatrix<R>) -> Bool {
        if (a.rows, a.cols) != (b.rows, b.cols) {
