public static Dictionary <int, GaNumMultivector> ToOutermorphismDictionary(this Matrix linearVectorMapsMatrix) { var domainGaSpaceDim = linearVectorMapsMatrix.ColumnCount.ToGaSpaceDimension(); var targetGaSpaceDim = linearVectorMapsMatrix.RowCount.ToGaSpaceDimension(); var omMapDict = new Dictionary <int, GaNumMultivector>(); //Add unit scalar as the image of the 0-basis blade omMapDict.Add(0, GaNumMultivector.CreateUnitScalar(targetGaSpaceDim)); for (var id = 1; id <= domainGaSpaceDim - 1; id++) { GaNumMultivector basisBladeImage; if (id.IsValidBasisVectorId()) { //Add images of vector basis blades basisBladeImage = GaNumMultivector.CreateVectorFromColumn( linearVectorMapsMatrix, id.BasisBladeIndex() ); } else { //Add images of a higher dimensional basis blade using the outer product //of the images of two lower dimensional basis blades int id1, id2; id.SplitBySmallestBasicPattern(out id1, out id2); basisBladeImage = omMapDict[id1].Op(omMapDict[id2]); } if (!basisBladeImage.IsZero()) { omMapDict.Add(id, basisBladeImage); } } return(omMapDict); }
public static Dictionary <int, GaNumMultivector> ToOutermorphismDictionary(this Dictionary <int, IGaNumMultivector> linearVectorMaps, int domainVSpaceDim, int targetVSpaceDim) { var domainGaSpaceDim = domainVSpaceDim.ToGaSpaceDimension(); var targetGaSpaceDim = targetVSpaceDim.ToGaSpaceDimension(); var omMapDict = new Dictionary <int, GaNumMultivector>(); //Add unit scalar as the image of the 0-basis blade omMapDict.Add(0, GaNumMultivector.CreateUnitScalar(targetGaSpaceDim)); for (var id = 1; id <= domainGaSpaceDim - 1; id++) { GaNumMultivector basisBladeImage; if (id.IsValidBasisVectorId()) { //Add images of vector basis blades IGaNumMultivector mv; linearVectorMaps.TryGetValue(id.BasisBladeIndex(), out mv); basisBladeImage = mv?.GetVectorPart() ?? GaNumMultivector.CreateZero(targetGaSpaceDim); } else { //Add images of a higher dimensional basis blade using the outer product //of the images of two lower dimensional basis blades int id1, id2; id.SplitBySmallestBasicPattern(out id1, out id2); basisBladeImage = omMapDict[id1].Op(omMapDict[id2]); } if (!basisBladeImage.IsZero()) { omMapDict.Add(id, basisBladeImage); } } return(omMapDict); }
public static Dictionary <int, GaNumMultivector> ToOutermorphismDictionary(this IEnumerable <IGaNumMultivector> linearVectorMaps) { var linearVectorMapsArray = linearVectorMaps.ToArray(); var domainGaSpaceDim = linearVectorMapsArray.Length.ToGaSpaceDimension(); var targetGaSpaceDim = linearVectorMapsArray[0].GaSpaceDimension; var omMapDict = new Dictionary <int, GaNumMultivector>(); //Add unit scalar as the image of the 0-basis blade omMapDict.Add(0, GaNumMultivector.CreateUnitScalar(targetGaSpaceDim)); for (var id = 1; id <= domainGaSpaceDim - 1; id++) { GaNumMultivector basisBladeImage; if (id.IsValidBasisVectorId()) { //Add images of vector basis blades basisBladeImage = linearVectorMapsArray[id.BasisBladeIndex()].GetVectorPart(); } else { //Add images of a higher dimensional basis blade using the outer product //of the images of two lower dimensional basis blades int id1, id2; id.SplitBySmallestBasicPattern(out id1, out id2); basisBladeImage = omMapDict[id1].Op(omMapDict[id2]); } if (!basisBladeImage.IsZero()) { omMapDict.Add(id, basisBladeImage); } } return(omMapDict); }