private DataElement ContinueReadingStructure(
            BinaryReader reader,
            ArrayFlags flags,
            int[] dimensions,
            string name,
            int fieldNameLength)
        {
            var element    = Read(reader);
            var fieldNames = ReadFieldNames(element as MiNum <sbyte>, fieldNameLength);
            var fields     = new Dictionary <string, List <IArray> >();

            foreach (var fieldName in fieldNames)
            {
                fields[fieldName] = new List <IArray>();
            }

            var numberOfElements = dimensions.NumberOfElements();

            for (var i = 0; i < numberOfElements; i++)
            {
                foreach (var fieldName in fieldNames)
                {
                    var field = Read(reader) as IArray;
                    fields[fieldName].Add(field);
                }
            }

            return(new MatStructureArray(flags, dimensions, name, fields));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Construct a numerical array.
        /// </summary>
        /// <typeparam name="T">Element type.</typeparam>
        /// <param name="flags">Array flags.</param>
        /// <param name="dimensions">Array dimensions.</param>
        /// <param name="name">Array name.</param>
        /// <param name="realData">Real parts of the values.</param>
        /// <param name="imaginaryData">Imaginary parts of the values.</param>
        /// <returns>A constructed array.</returns>
        /// <remarks>
        /// Possible values for T: Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double,
        ///   ComplexOf&lt;TReal&gt; (where TReal is one of Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single),
        ///   Complex.
        /// </remarks>
        public static MatArray ConvertToMatNumericalArrayOf <T>(
            ArrayFlags flags,
            int[] dimensions,
            string name,
            DataElement realData,
            DataElement imaginaryData)
            where T : struct
        {
            if (flags.Variable.HasFlag(Variable.IsLogical))
            {
                var data = DataExtraction.GetDataAsUInt8(realData).ToArrayLazily().Select(x => x != 0).ToArray();
                return(new MatNumericalArrayOf <bool>(flags, dimensions, name, data));
            }
            switch (flags.Class)
            {
            case ArrayType.MxChar:
                switch (realData)
                {
                case MiNum <byte> dataByte:
                    return(ConvertToMatCharArray(flags, dimensions, name, dataByte));

                case MiNum <ushort> dataUshort:
                    return(ConvertToMatCharArray(flags, dimensions, name, dataUshort));

                default:
                    throw new NotSupportedException("Only utf8, utf16 or ushort char arrays are supported.");
                }

            case ArrayType.MxDouble:
            case ArrayType.MxSingle:
            case ArrayType.MxInt8:
            case ArrayType.MxUInt8:
            case ArrayType.MxInt16:
            case ArrayType.MxUInt16:
            case ArrayType.MxInt32:
            case ArrayType.MxUInt32:
            case ArrayType.MxInt64:
            case ArrayType.MxUInt64:
                var dataArray = ConvertDataToProperType <T>(realData, flags.Class);
                if (flags.Variable.HasFlag(Variable.IsComplex))
                {
                    var dataArray2 = ConvertDataToProperType <T>(imaginaryData, flags.Class);
                    if (flags.Class == ArrayType.MxDouble)
                    {
                        var complexArray =
                            (dataArray as double[])
                            .Zip(dataArray2 as double[], (x, y) => new Complex(x, y))
                            .ToArray();
                        return(new MatNumericalArrayOf <Complex>(flags, dimensions, name, complexArray));
                    }
                    var complexDataArray = dataArray.Zip(dataArray2, (x, y) => new ComplexOf <T>(x, y)).ToArray();
                    return(new MatNumericalArrayOf <ComplexOf <T> >(flags, dimensions, name, complexDataArray));
                }
                return(new MatNumericalArrayOf <T>(flags, dimensions, name, dataArray));

            default:
                throw new NotSupportedException();
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="MatStructureArray"/> class.
 /// </summary>
 /// <param name="flags">Array properties.</param>
 /// <param name="dimensions">Dimensions of the array.</param>
 /// <param name="name">Array name.</param>
 /// <param name="fields">Array contents.</param>
 public MatStructureArray(
     ArrayFlags flags,
     int[] dimensions,
     string name,
     Dictionary <string, List <IArray> > fields)
     : base(flags, dimensions, name)
 {
     Fields = fields;
 }
Exemplo n.º 4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MatArray"/> class.
 /// </summary>
 /// <param name="flags">Array properties.</param>
 /// <param name="dimensions">Dimensions of the array.</param>
 /// <param name="name">Array name.</param>
 protected MatArray(
     ArrayFlags flags,
     int[] dimensions,
     string name)
 {
     Flags      = flags;
     Dimensions = dimensions;
     Name       = name;
 }
Exemplo n.º 5
0
        private static MatCharArrayOf <byte> ConvertToMatCharArray(
            ArrayFlags flags,
            int[] dimensions,
            string name,
            MiNum <byte> dataElement)
        {
            var data = dataElement.Data;

            return(new MatCharArrayOf <byte>(flags, dimensions, name, data, Encoding.UTF8.GetString(data)));
        }
Exemplo n.º 6
0
        private static MatCharArrayOf <ushort> ConvertToMatCharArray(
            ArrayFlags flags,
            int[] dimensions,
            string name,
            MiNum <ushort> dataElement)
        {
            var data = dataElement.Data;

            return(new MatCharArrayOf <ushort>(
                       flags,
                       dimensions,
                       name,
                       data,
                       new string(data.Select(x => (char)x).ToArray())));
        }
        private DataElement ContinueReadingCellArray(
            BinaryReader reader,
            ArrayFlags flags,
            int[] dimensions,
            string name)
        {
            var numberOfElements = dimensions.NumberOfElements();
            var elements         = new List <IArray>();

            for (var i = 0; i < numberOfElements; i++)
            {
                var element = Read(reader) as IArray;
                elements.Add(element);
            }

            return(new MatCellArray(flags, dimensions, name, elements));
        }
Exemplo n.º 8
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MatNumericalArrayOf{T}"/> class.
 /// </summary>
 /// <param name="flags">Array parameters.</param>
 /// <param name="dimensions">Dimensions of the array.</param>
 /// <param name="name">Array name.</param>
 /// <param name="data">Array contents.</param>
 public MatNumericalArrayOf(ArrayFlags flags, int[] dimensions, string name, T[] data)
     : base(flags, dimensions, name)
 {
     Data = data;
 }
Exemplo n.º 9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MatCellArray"/> class.
 /// </summary>
 /// <param name="flags">Array properties.</param>
 /// <param name="dimensions">Dimensions of the array.</param>
 /// <param name="name">Array name.</param>
 /// <param name="elements">Array elements.</param>
 public MatCellArray(ArrayFlags flags, int[] dimensions, string name, IEnumerable <IArray> elements)
     : base(flags, dimensions, name)
 {
     Data = elements.ToArray();
 }