private static MLCell CreateCellArrayCustom(string name, string[] items) { var cell = new MLCell(name, new int[] { items.Length, 1 }); int i = 0; foreach (var item in items) { double ans = 0; if (double.TryParse(items[i], out ans)) { cell[i] = new MLDouble(null, new double[] { ans }, 1); i++; continue; } if (items[i].TrimStart().StartsWith("[") && items[i].TrimEnd().EndsWith("]")) { cell[i] = CreateCellArrayCustom("", items[i].Split(new[] { ' ', '[', ']' }, StringSplitOptions.RemoveEmptyEntries)); i++; continue; } cell[i] = new MLChar(null, (string)items[i].Trim()); i++; } return(cell); }
private static MLArray CreateCellArray(string name, string[] names) { MLCell cell = new MLCell(name, new int[] {names.Length, 1}); for (int i = 0; i < names.Length; i++) cell[i] = new MLChar(null, names[i]); return cell; }
static void DoWrite(string fn, Dictionary <string, MatLab.DoubleList> data, Dictionary <string, List <MLCell> > dataCell, SortedDictionary <string, double> param, List <MLArray> mlList, Hashtable seen) { log.Info("DoWrite start " + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); foreach (var item in data) { double[][] temp = item.Value.ToArray(); MLArray dbarray = new MLDouble(item.Key, temp); mlList.Add(dbarray); log.Info("DoWrite Double " + item.Key + " " + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); } // datacell contains rows foreach (var item in dataCell) { // create msg table MLCell temp1 = new MLCell(item.Key + "1", new int[] { 1, item.Value.Count }); int a = 0; // add rows to msg table foreach (var mlCell in item.Value) { temp1[a] = item.Value[a]; a++; } // add table to masterlist mlList.Add(temp1); log.Info("DoWrite Cell " + item.Key + " " + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); } log.Info("DoWrite mllist " + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); MLCell cell = new MLCell("PARM", new int[] { param.Keys.Count, 2 }); int m = 0; foreach (var item in param.Keys) { cell[m, 0] = new MLChar(null, item.ToString()); cell[m, 1] = new MLDouble(null, new double[] { (double)param[item] }, 1); m++; } mlList.Add(cell); MLArray seenmsg = CreateCellArray("Seen", seen.Keys.Cast <string>().ToArray()); mlList.Add(seenmsg); try { log.Info("write " + fn + ".mat"); log.Info("DoWrite before" + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); MatFileWriter mfw = new MatFileWriter(fn + ".mat", mlList, false); log.Info("DoWrite done" + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); } catch (Exception err) { throw new Exception("There was an error when creating the MAT-file: \n" + err.ToString(), err); } }
private static MLArray CreateCellArray() { string[] names = new string[] { "Hello", "World", "I am", "a", "MAT-file" }; MLCell cell = new MLCell("Names", new int[] { names.Length, 1 }); for (int i = 0; i < names.Length; i++) cell[i] = new MLChar(null, names[i]); return cell; }
private static MLArray CreateCellArray(string name, string[] names) { MLCell cell = new MLCell(name, new int[] { names.Length, 1 }); for (int i = 0; i < names.Length; i++) { cell[i] = new MLChar(null, names[i]); } return(cell); }
static MLArray CreateCellArray() { var names = new[] { "Hello", "World", "I am", "a", "MAT-file" }; var cell = new MLCell("Names", new[] { names.Length, 1 }); for (var i = 0; i < names.Length; i++) { cell[i] = new MLChar(null, names[i]); } return(cell); }
private static MLArray CreateCellArray() { string[] names = new string[] { "Hello", "World", "I am", "a", "MAT-file" }; MLCell cell = new MLCell("Names", new int[] { names.Length, 1 }); for (int i = 0; i < names.Length; i++) { cell[i] = new MLChar(null, names[i]); } return(cell); }
//public void CreateCSVFile(DataTable dt, string strFilePath) //{ // #region Export Grid to CSV // // Create the CSV file to which grid data will be exported. // StreamWriter sw = new StreamWriter(strFilePath, false); // // First we will write the headers. // //DataTable dt = m_dsProducts.Tables[0]; // int iColCount = dt.Columns.Count; // for (int i = 0; i < iColCount; i++) // { // sw.Write(dt.Columns[i]); // if (i < iColCount - 1) // { // sw.Write(","); // } // } // sw.Write(sw.NewLine); // // Now write all the rows. // foreach (DataRow dr in dt.Rows) // { // for (int i = 0; i < iColCount; i++) // { // if (!Convert.IsDBNull(dr[i])) // { // sw.Write(dr[i].ToString()); // } // if (i < iColCount - 1) // { // sw.Write(","); // } // } // sw.Write(sw.NewLine); // } // sw.Close(); // #endregion //} private MLArray createStruct() { MLStructure outStruct = new MLStructure("kinectData", new int[] { 1, 1 }); //string[] headers = {"HipCenterX", "HipCenterY", "HipCenterZ", "SpineX", "SpineY", "SpineZ", "ShoulderCenterX", // "ShoulderCenterY", "ShoulderCenterZ", "HeadX", "HeadY", "HeadZ", "ShoulderLeftX", // "ShoulderLeftY", "ShoulderLeftZ", "ElbowLeftX", "ElbowLeftY", "ElbowLeftZ", "WristLeftX", // "WristLeftY", "WristLeftZ", "HandLeftX", "HandLeftY", "HandLeftZ", "ShoulderRightX", // "ShoulderRightY", "ShoulderRightZ", "ElbowRightX", "ElbowRightY", "ElbowRightZ", // "WristRightX", "WristRightY", "WristRightZ", "HandRightX", "HandRightY", "HandRightZ", // "HipLeftX", "HipLeftY", "HipLeftZ", "KneeLeftX", "KneeLeftY", "KneeLeftZ", "AnkleLeftX", // "AnkleLeftY", "AnkleLeftZ", "FootLeftX", "FootLeftY", "FootLeftZ", "HipRightX", "HipRightY", // "HipRightZ", "KneeRightX", "KneeRightY", "KneeRightZ", "AnkleRightX", "AnkleRightY", // "AnkleRightZ", "FootRightX", "FootRightY", "FootRightZ"}; double criticalC1D = Convert.ToDouble(criticalC1); double criticalC2D = Convert.ToDouble(criticalC2); double criticalC3D = Convert.ToDouble(criticalC3); double criticalC11D = Convert.ToDouble(criticalC11); double criticalC21D = Convert.ToDouble(criticalC21); double criticalC31D = Convert.ToDouble(criticalC31); double criticalC12D = Convert.ToDouble(criticalC12); double criticalC22D = Convert.ToDouble(criticalC22); double criticalC32D = Convert.ToDouble(criticalC32); double criticalC13D = Convert.ToDouble(criticalC13); double criticalC23D = Convert.ToDouble(criticalC23); double criticalC33D = Convert.ToDouble(criticalC33); double criticalC14D = Convert.ToDouble(criticalC14); double criticalC24D = Convert.ToDouble(criticalC24); double criticalC34D = Convert.ToDouble(criticalC34); double[] ccArray = { criticalC1D, criticalC2D, criticalC3D, criticalC11D, criticalC21D, criticalC31D, criticalC12D, criticalC22D, criticalC32D, criticalC13D, criticalC23D, criticalC33D, criticalC14D, criticalC24D, criticalC34D }; Double[] skelDataA = (Double[])skelData.ToArray(typeof(double)); Double[] gpVectorA = (Double[])gpVector.ToArray(typeof(double)); Double[] kinectTiltA = (Double[])kinectTilt.ToArray(typeof(double)); outStruct["skelData", 0] = new MLDouble("", skelDataA, 60); outStruct["dateHeader", 0] = new MLChar("", timeStamp); outStruct["criticalComps", 0] = new MLDouble("", ccArray, 3); outStruct["exercise", 0] = new MLChar("", exercise); MLStructure groundStruct = new MLStructure("", new int[] { 1, 1 }); groundStruct["height", 0] = new MLDouble("", new double[] { 0.68 }, 1); // metres? groundStruct["gpVector", 0] = new MLDouble("", gpVectorA, 4); //metres? groundStruct["kinectTilt", 0] = new MLDouble("", kinectTiltA, 1); //degrees outStruct["groundPlaneData", 0] = groundStruct; return(outStruct); }
static void DoWrite(string fn, Dictionary <string, DoubleList> data, SortedDictionary <string, double> param, List <MLArray> mlList, Hashtable seen) { log.Info("DoWrite start " + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); foreach (var item in data) { double[][] temp = item.Value.ToArray(); MLArray dbarray = new MLDouble(item.Key, temp); mlList.Add(dbarray); log.Info("DoWrite " + item.Key + " " + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); } log.Info("DoWrite mllist " + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); MLCell cell = new MLCell("PARM", new int[] { param.Keys.Count, 2 }); int m = 0; foreach (var item in param.Keys) { cell[m, 0] = new MLChar(null, item.ToString()); cell[m, 1] = new MLDouble(null, new double[] { (double)param[item] }, 1); m++; } mlList.Add(cell); MLArray seenmsg = CreateCellArray("Seen", seen.Keys.Cast <string>().ToArray()); mlList.Add(seenmsg); try { log.Info("write " + fn + ".mat"); log.Info("DoWrite before" + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); MatFileWriter mfw = new MatFileWriter(fn + ".mat", mlList, true); log.Info("DoWrite done" + (GC.GetTotalMemory(false) / 1024.0 / 1024.0)); } catch (Exception err) { CustomMessageBox.Show("There was an error when creating the MAT-file: \n" + err.ToString(), "MAT-File Creation Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } }
private static MLArray CreateTestStruct() { MLStructure outStruct = new MLStructure("kinectData", new int[] { 1, 1 }); double[] myRealNums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; // new MLInt64("IA", myRealNums, myImagNums, length); // IA: matlab Name (blank for struct) // realNumbers => Double array of the real parts // imagNumbers => Double array of the img parts // length => dimension of the matrix outStruct["skelData", 0] = new MLDouble("", myRealNums, 2); outStruct["dateHeader", 0] = new MLChar("", "January 29th... etc..."); MLStructure groundStruct = new MLStructure("", new int[] { 1, 1 }); groundStruct["height", 0] = new MLDouble("", new double[] { 0.68 }, 1); // metres? groundStruct["gpVector", 0] = new MLDouble("", new double[] {1.4, 1, 1, 1}, 4); //metres? groundStruct["kinectTilt", 0] = new MLInt16("", new Int16[]{ -15 }, 1); //degrees outStruct["groundPlaneData", 0] = groundStruct; return outStruct; }
private static MLCell CreateCellArrayCustom(string name, string[] items) { var cell = new MLCell(name, new int[] { items.Length, 1 }); int i = 0; foreach (var item in items) { double ans = 0; if (double.TryParse(items[i], out ans)) { cell[i] = new MLDouble(null, new double[] { ans }, 1); i++; continue; } cell[i] = new MLChar(null, (string)items[i].Trim()); i++; } return(cell); }
private static MLArray CreateTestStruct() { MLStructure outStruct = new MLStructure("kinectData", new int[] { 1, 1 }); double[] myRealNums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; // new MLInt64("IA", myRealNums, myImagNums, length); // IA: matlab Name (blank for struct) // realNumbers => Double array of the real parts // imagNumbers => Double array of the img parts // length => dimension of the matrix outStruct["skelData", 0] = new MLDouble("", myRealNums, 2); outStruct["dateHeader", 0] = new MLChar("", "January 29th... etc..."); MLStructure groundStruct = new MLStructure("", new int[] { 1, 1 }); groundStruct["height", 0] = new MLDouble("", new double[] { 0.68 }, 1); // metres? groundStruct["gpVector", 0] = new MLDouble("", new double[] { 1.4, 1, 1, 1 }, 4); //metres? groundStruct["kinectTilt", 0] = new MLInt16("", new Int16[] { -15 }, 1); //degrees outStruct["groundPlaneData", 0] = groundStruct; return(outStruct); }
public async static Task Export(String filename, Project project, ILogger logger = null, CancellationToken cancelletionToken = default(CancellationToken)) { logger?.WriteLineInfo(""); logger?.WriteLineInfo("Saving project into MAT file!"); logger?.WriteLineInfo("MAT file location: " + filename); List <MLArray> mlList = new List <MLArray>(); int pi = 0; foreach (DataStream dataStream in project.DataStreams) { pi++; cancelletionToken.ThrowIfCancellationRequested(); logger?.WriteLineInfo("Exporting " + dataStream.ShortName + " datastream..."); logger?.WriteProgress((double)pi / (double)project.DataStreams.Count() * 100.0); MLStructure structDataStream = new MLStructure(dataStream.ShortName, new int[] { 1, 1 }); structDataStream["Name", 0] = new MLChar(null, dataStream.Name); structDataStream["ShortName", 0] = new MLChar(null, dataStream.ShortName); if (dataStream.DataLines.Count > 0) { // DataLines MLCell arrayDataLines = new MLCell("DataLines", new int[] { dataStream.DataLines.Count, 1 }); int k = 0; foreach (DataLine dataLine in dataStream.DataLines) { MLStructure structDataLine = new MLStructure(dataStream.ShortName, new int[] { 1, 1 }); structDataLine["Timestamp", 0] = new MLDouble("", new double[] { Utils.ConvertToUnixTimestamp(dataLine.TimeStamp) }, 1); structDataLine["TimestampC", 0] = ConvertDateTimeToMLDouble(dataLine.TimeStamp); if (dataLine is ImageDataLine) { structDataLine["ImageFileName", 0] = new MLChar(null, (dataLine as ImageDataLine).ImageFileName); } if (dataLine is VideoDataLine) { structDataLine["VideoFileName", 0] = new MLChar(null, (dataLine as VideoDataLine).VideoFileName); } arrayDataLines[k] = structDataLine; k++; } structDataStream["DataLines", 0] = arrayDataLines; } if (dataStream is GPSDataStream) { GPSDataStream gpsDataStream = dataStream as GPSDataStream; // Event Marker if (gpsDataStream.MarkerEvents.Count > 0) { MLCell arrayMarkerEvents = new MLCell("MarkerEvents", new int[] { gpsDataStream.MarkerEvents.Count, 1 }); int k = 0; foreach (EvenMarkerDataLine evnt in gpsDataStream.MarkerEvents) { MLStructure structEventMarkers = new MLStructure(dataStream.ShortName, new int[] { 1, 1 }); structEventMarkers["Timestamp", 0] = new MLDouble("", new double[] { (double)evnt.TimeStamp.Ticks }, 1); structEventMarkers["TimestampC", 0] = ConvertDateTimeToMLDouble(evnt.TimeStamp); structEventMarkers["Port", 0] = new MLChar(null, evnt.Port.ToString()); arrayMarkerEvents[k] = structEventMarkers; k++; } structDataStream["MarkerEvents", 0] = arrayMarkerEvents; } // Positions if (gpsDataStream.Positions.Count > 0) { double[][] points = new double[gpsDataStream.Positions.Count][]; int k = 0; foreach (GPSPositionDataLine pt in gpsDataStream.Positions) { points[k] = new double[5]; points[k][0] = Utils.ConvertToUnixTimestamp(pt.TimeStamp); points[k][1] = pt.Lat; points[k][2] = pt.Lon; points[k][3] = pt.Height; points[k][4] = pt.Quality; k++; } MLDouble arrayPoints = new MLDouble("Points", points); structDataStream["Points", 0] = arrayPoints; } } mlList.Add(structDataStream); } try { MatFileWriter mfw = new MatFileWriter(filename, mlList, false); } catch (Exception ex) { logger?.WriteLineError("Error occured: " + ex.ToString()); return; } logger?.WriteLineInfo("MAT file location: " + filename); logger?.WriteLineInfo("Done."); }
static void DoWrite(string fn, Dictionary<string, DoubleList> data, SortedDictionary<string, double> param, List<MLArray> mlList, Hashtable seen) { log.Info("DoWrite start " + (GC.GetTotalMemory(false)/1024.0/1024.0)); foreach (var item in data) { double[][] temp = item.Value.ToArray(); MLArray dbarray = new MLDouble(item.Key, temp); mlList.Add(dbarray); log.Info("DoWrite " + item.Key + " " + (GC.GetTotalMemory(false)/1024.0/1024.0)); } log.Info("DoWrite mllist " + (GC.GetTotalMemory(false)/1024.0/1024.0)); MLCell cell = new MLCell("PARM", new int[] {param.Keys.Count, 2}); int m = 0; foreach (var item in param.Keys) { cell[m, 0] = new MLChar(null, item.ToString()); cell[m, 1] = new MLDouble(null, new double[] {(double) param[item]}, 1); m++; } mlList.Add(cell); MLArray seenmsg = CreateCellArray("Seen", seen.Keys.Cast<string>().ToArray()); mlList.Add(seenmsg); try { log.Info("write " + fn + ".mat"); log.Info("DoWrite before" + (GC.GetTotalMemory(false)/1024.0/1024.0)); MatFileWriter mfw = new MatFileWriter(fn + ".mat", mlList, true); log.Info("DoWrite done" + (GC.GetTotalMemory(false)/1024.0/1024.0)); } catch (Exception err) { CustomMessageBox.Show("There was an error when creating the MAT-file: \n" + err.ToString(), "MAT-File Creation Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } }
//public void CreateCSVFile(DataTable dt, string strFilePath) //{ // #region Export Grid to CSV // // Create the CSV file to which grid data will be exported. // StreamWriter sw = new StreamWriter(strFilePath, false); // // First we will write the headers. // //DataTable dt = m_dsProducts.Tables[0]; // int iColCount = dt.Columns.Count; // for (int i = 0; i < iColCount; i++) // { // sw.Write(dt.Columns[i]); // if (i < iColCount - 1) // { // sw.Write(","); // } // } // sw.Write(sw.NewLine); // // Now write all the rows. // foreach (DataRow dr in dt.Rows) // { // for (int i = 0; i < iColCount; i++) // { // if (!Convert.IsDBNull(dr[i])) // { // sw.Write(dr[i].ToString()); // } // if (i < iColCount - 1) // { // sw.Write(","); // } // } // sw.Write(sw.NewLine); // } // sw.Close(); // #endregion //} private MLArray createStruct() { MLStructure outStruct = new MLStructure("kinectData", new int[] { 1, 1 }); //string[] headers = {"HipCenterX", "HipCenterY", "HipCenterZ", "SpineX", "SpineY", "SpineZ", "ShoulderCenterX", // "ShoulderCenterY", "ShoulderCenterZ", "HeadX", "HeadY", "HeadZ", "ShoulderLeftX", // "ShoulderLeftY", "ShoulderLeftZ", "ElbowLeftX", "ElbowLeftY", "ElbowLeftZ", "WristLeftX", // "WristLeftY", "WristLeftZ", "HandLeftX", "HandLeftY", "HandLeftZ", "ShoulderRightX", // "ShoulderRightY", "ShoulderRightZ", "ElbowRightX", "ElbowRightY", "ElbowRightZ", // "WristRightX", "WristRightY", "WristRightZ", "HandRightX", "HandRightY", "HandRightZ", // "HipLeftX", "HipLeftY", "HipLeftZ", "KneeLeftX", "KneeLeftY", "KneeLeftZ", "AnkleLeftX", // "AnkleLeftY", "AnkleLeftZ", "FootLeftX", "FootLeftY", "FootLeftZ", "HipRightX", "HipRightY", // "HipRightZ", "KneeRightX", "KneeRightY", "KneeRightZ", "AnkleRightX", "AnkleRightY", // "AnkleRightZ", "FootRightX", "FootRightY", "FootRightZ"}; double criticalC1D = Convert.ToDouble(criticalC1); double criticalC2D = Convert.ToDouble(criticalC2); double criticalC3D = Convert.ToDouble(criticalC3); double criticalC11D = Convert.ToDouble(criticalC11); double criticalC21D = Convert.ToDouble(criticalC21); double criticalC31D = Convert.ToDouble(criticalC31); double criticalC12D = Convert.ToDouble(criticalC12); double criticalC22D = Convert.ToDouble(criticalC22); double criticalC32D = Convert.ToDouble(criticalC32); double criticalC13D = Convert.ToDouble(criticalC13); double criticalC23D = Convert.ToDouble(criticalC23); double criticalC33D = Convert.ToDouble(criticalC33); double criticalC14D = Convert.ToDouble(criticalC14); double criticalC24D = Convert.ToDouble(criticalC24); double criticalC34D = Convert.ToDouble(criticalC34); double[] ccArray = { criticalC1D, criticalC2D, criticalC3D, criticalC11D, criticalC21D, criticalC31D, criticalC12D, criticalC22D, criticalC32D, criticalC13D, criticalC23D, criticalC33D, criticalC14D, criticalC24D, criticalC34D}; Double[] skelDataA = (Double[])skelData.ToArray(typeof(double)); Double[] gpVectorA = (Double[])gpVector.ToArray(typeof(double)); Double[] kinectTiltA = (Double[])kinectTilt.ToArray(typeof(double)); outStruct["skelData", 0] = new MLDouble("", skelDataA, 60); outStruct["dateHeader", 0] = new MLChar("", timeStamp); outStruct["criticalComps", 0] = new MLDouble("", ccArray, 3); outStruct["exercise", 0] = new MLChar("", exercise); MLStructure groundStruct = new MLStructure("", new int[] { 1, 1 }); groundStruct["height", 0] = new MLDouble("", new double[] { 0.68 }, 1); // metres? groundStruct["gpVector", 0] = new MLDouble("", gpVectorA, 4); //metres? groundStruct["kinectTilt", 0] = new MLDouble("", kinectTiltA, 1); //degrees outStruct["groundPlaneData", 0] = groundStruct; return outStruct; }
public static void log(string fn) { // read the file string[] filelines = File.ReadAllLines(fn); // store all the arrays List<MLArray> mlList = new List<MLArray>(); // store data to putinto the arrays Dictionary<string, List<double[]>> data = new Dictionary<string, List<double[]>>(); // store line item lengths Hashtable len = new Hashtable(); // store whats we have seen in the log Hashtable seen = new Hashtable(); // store the params seen SortedDictionary<string, double> param = new SortedDictionary<string, double>(); // keep track of line no int a = 0; foreach (var line in filelines) { a++; Console.Write(a + "\r"); string strLine = line.Replace(", ", ","); strLine = strLine.Replace(": ", ":"); string[] items = strLine.Split(',', ':'); // process the fmt messages if (line.StartsWith("FMT")) { // +1 for line no string[] names = new string[items.Length - 5 + 1]; names[0] = "LineNo"; Array.ConstrainedCopy(items, 5, names, 1, names.Length - 1); MLArray format = CreateCellArray(items[3] + "_label", names); if (items[3] == "PARM") { } else { mlList.Add(format); } len[items[3]] = names.Length; } // process param messages else if (line.StartsWith("PARM")) { param[items[1]] = double.Parse(items[2]); }// everyting else is generic else { // make sure the line is long enough if (items.Length < 2) continue; // check we have a valid fmt message for this message type if (!len.ContainsKey(items[0])) continue; // check the fmt length matchs what the log has if (items.Length != (int)len[items[0]]) continue; // make it as being seen seen[items[0]] = 1; double[] dbarray = new double[items.Length]; // set line no dbarray[0] = a; for (int n = 1; n < items.Length; n++) { try { dbarray[n] = double.Parse(items[n]); } catch { } } if (!data.ContainsKey(items[0])) data[items[0]] = new List<double[]>(); data[items[0]].Add(dbarray); } } foreach (var item in data) { double[][] temp = item.Value.ToArray(); MLArray dbarray = new MLDouble(item.Key, temp); mlList.Add(dbarray); } MLCell cell = new MLCell("PARM", new int[] { param.Keys.Count, 2 }); int m = 0; foreach (var item in param.Keys) { cell[m, 0] = new MLChar(null, item.ToString()); cell[m, 1] = new MLDouble(null, new double[] { (double)param[item] }, 1); m++; } mlList.Add(cell); MLArray seenmsg = CreateCellArray("Seen", seen.Keys.Cast<string>().ToArray()); mlList.Add(seenmsg); try { MatFileWriter mfw = new MatFileWriter(fn + ".mat", mlList, true); } catch (Exception err) { MessageBox.Show("There was an error when creating the MAT-file: \n" + err.ToString(), "MAT-File Creation Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } }
public static void log(string fn) { string[] filelines; if (fn.ToLower().EndsWith(".bin")) { filelines = BinaryLog.ReadLog(fn).ToArray(); } else { // read the file filelines = File.ReadAllLines(fn); } // store all the arrays List <MLArray> mlList = new List <MLArray>(); // store data to putinto the arrays Dictionary <string, List <double[]> > data = new Dictionary <string, List <double[]> >(); // store line item lengths Hashtable len = new Hashtable(); // store whats we have seen in the log Hashtable seen = new Hashtable(); // store the params seen SortedDictionary <string, double> param = new SortedDictionary <string, double>(); // keep track of line no int a = 0; foreach (var line in filelines) { a++; Console.Write(a + "\r"); string strLine = line.Replace(", ", ","); strLine = strLine.Replace(": ", ":"); string[] items = strLine.Split(',', ':'); // process the fmt messages if (line.StartsWith("FMT")) { // +1 for line no string[] names = new string[items.Length - 5 + 1]; names[0] = "LineNo"; Array.ConstrainedCopy(items, 5, names, 1, names.Length - 1); MLArray format = CreateCellArray(items[3] + "_label", names); if (items[3] == "PARM") { } else { mlList.Add(format); } len[items[3]] = names.Length; } // process param messages else if (line.StartsWith("PARM")) { try { param[items[1]] = double.Parse(items[2], CultureInfo.InvariantCulture); } catch { } }// everyting else is generic else { // make sure the line is long enough if (items.Length < 2) { continue; } // check we have a valid fmt message for this message type if (!len.ContainsKey(items[0])) { continue; } // check the fmt length matchs what the log has if (items.Length != (int)len[items[0]]) { continue; } // make it as being seen seen[items[0]] = 1; double[] dbarray = new double[items.Length]; // set line no dbarray[0] = a; for (int n = 1; n < items.Length; n++) { try { dbarray[n] = double.Parse(items[n], CultureInfo.InvariantCulture); } catch { } } if (!data.ContainsKey(items[0])) { data[items[0]] = new List <double[]>(); } data[items[0]].Add(dbarray); } } foreach (var item in data) { double[][] temp = item.Value.ToArray(); MLArray dbarray = new MLDouble(item.Key, temp); mlList.Add(dbarray); } MLCell cell = new MLCell("PARM", new int[] { param.Keys.Count, 2 }); int m = 0; foreach (var item in param.Keys) { cell[m, 0] = new MLChar(null, item.ToString()); cell[m, 1] = new MLDouble(null, new double[] { (double)param[item] }, 1); m++; } mlList.Add(cell); MLArray seenmsg = CreateCellArray("Seen", seen.Keys.Cast <string>().ToArray()); mlList.Add(seenmsg); try { MatFileWriter mfw = new MatFileWriter(fn + ".mat", mlList, true); } catch (Exception err) { MessageBox.Show("There was an error when creating the MAT-file: \n" + err.ToString(), "MAT-File Creation Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } }
public static void ExportHotFrame(String rootFolder, String annotationName, HotFrame frame, MatlabExporterOptions options = MatlabExporterOptions.Overwrite, ILogger logger = null, CancellationToken cancelletionToken = default(CancellationToken)) { // delete features /*List<Feature> newFeatureSet = new List<Feature>(); * foreach (Feature feature in frame.Features) * { * if (feature.DataStream != null) newFeatureSet.Add(feature); * } * frame.Features = newFeatureSet;*/ String folderName = rootFolder + "\\frame_" + annotationName; String matFilePath = folderName + "\\frame_" + annotationName + ".mat"; Directory.CreateDirectory(folderName); logger?.WriteLineInfo(""); logger?.WriteLineInfo("Convert frame to Matlab MAT format and export images!"); logger?.WriteLineInfo("Export folder: " + folderName); logger?.WriteLineInfo("MAT file location: " + matFilePath); List <MLArray> mlList = new List <MLArray>(); Dictionary <DataStream, List <VeloFeature> > velodyneData = new Dictionary <DataStream, List <VeloFeature> >(); if ((options == MatlabExporterOptions.Append) && (File.Exists(matFilePath))) { MatFileReader matReader = new MatFileReader(matFilePath); mlList = matReader.Data; } int i = 0; foreach (Feature feature in frame.Features) { logger?.WriteLineInfo("Exporting: " + feature.DataStream.ShortName); MLStructure structFeatures = new MLStructure(feature.DataStream.ShortName, new int[] { 1, 1 }); structFeatures["Name", 0] = new MLChar(null, feature.DataStream.Name); structFeatures["ShortName", 0] = new MLChar(null, feature.DataStream.ShortName); if (cancelletionToken.IsCancellationRequested == true) { logger?.WriteLineWarning("Export cancelled!"); return; } if (feature is GPSFeature) { var gpsFeature = feature as GPSFeature; structFeatures["Lat", 0] = new MLDouble("", new double[] { gpsFeature.Position.Lat }, 1); structFeatures["Lon", 0] = new MLDouble("", new double[] { gpsFeature.Position.Lon }, 1); structFeatures["Height", 0] = new MLDouble("", new double[] { gpsFeature.Position.Height }, 1); structFeatures["Quality", 0] = new MLDouble("", new double[] { gpsFeature.Position.Quality }, 1); mlList.Add(structFeatures); } else if (feature is ImageFeature) { ImageFeature imageFeature = feature as ImageFeature; structFeatures["Timestamp", 0] = new MLDouble("", new double[] { Utils.ConvertToUnixTimestamp(imageFeature.TimeStamp) }, 1); structFeatures["TimestampC", 0] = ConvertDateTimeToMLDouble(imageFeature.TimeStamp); double[][] points = new double[imageFeature.Points.Count][]; int k = 0; foreach (ImagePoint pt in ((ImageFeature)feature).Points) { points[k] = new double[3]; points[k][0] = pt.ID; points[k][1] = pt.X; points[k][2] = pt.Y; k++; } if (k != 0) { MLDouble arrayPoints = new MLDouble("Points", points); structFeatures["Points", 0] = arrayPoints; } // save images if (imageFeature.Image != null) { using (Bitmap img = new Bitmap(imageFeature.Image)) { img.Save(folderName + "\\frame_" + annotationName + "_" + feature.DataStream.ShortName + ".bmp"); } // you can export the images here, but it's very slow and the code also needs to be tested! /*using (Bitmap img = new Bitmap(imageFeature.Image)) * { * * int[] dims = new int[] { img.Width, img.Height, 3 }; * MLDouble arrImg = new MLDouble("Image", dims); * for (int i = 0; i < img.Width; i++) * { * for (int j = 0; j < img.Height; j++) * { * Color col = img.GetPixel(i, j); * arrImg.Set(col.R, i, j + img.Height * 0); * arrImg.Set(col.G, i, j + img.Height * 1); * arrImg.Set(col.B, i, j + img.Height * 2); * } * } * * structFeatures["Image", 0] = arrImg; * }*/ } mlList.Add(structFeatures); } else if (feature is VeloFeature) { VeloFeature veloFeature = feature as VeloFeature; // if key does not exist create one if (!velodyneData.ContainsKey(veloFeature.DataStream)) { velodyneData.Add(veloFeature.DataStream, new List <VeloFeature>()); } velodyneData[veloFeature.DataStream].Add(veloFeature); } i++; logger?.WriteProgress((double)i / (double)frame.Features.Count() * 100.0); } // ok, now finalize velodyne data foreach (KeyValuePair <DataStream, List <VeloFeature> > entry in velodyneData) { if (cancelletionToken.IsCancellationRequested == true) { logger?.WriteLineWarning("Export cancelled!"); return; } MLStructure structFeatures = new MLStructure(entry.Key.ShortName, new int[] { 1, 1 }); structFeatures["Name", 0] = new MLChar(null, entry.Key.Name); structFeatures["ShortName", 0] = new MLChar(null, entry.Key.ShortName); structFeatures["TimeStamp", 0] = new MLDouble("", new double[] { Utils.ConvertToUnixTimestamp(frame.Timestamp) }, 1); // get number of points long n_points = 0; foreach (VeloFeature feature in entry.Value) { n_points += feature.Points.Count(); } if (n_points == 0) { logger?.WriteLineWarning(entry.Key.ShortName + ": No features!"); continue; } // populate points double[][] points = new double[n_points][]; int k = 0; foreach (VeloFeature feature in entry.Value) { foreach (VelodynePoint pt in feature.Points) { points[k] = new double[9]; points[k][0] = feature.ID; points[k][1] = pt.X; points[k][2] = pt.Y; points[k][3] = pt.Z; points[k][4] = Convert.ToDouble(pt.Intensity); points[k][5] = pt.Distance; points[k][6] = pt.Hz; points[k][7] = pt.Vz; points[k][8] = pt.InternalTime; k++; } } MLDouble arrayPoints = new MLDouble("Points", points); structFeatures["Points", 0] = arrayPoints; mlList.Add(structFeatures); } try { logger?.WriteLineInfo("Saving mat file..."); MatFileWriter mfw = new MatFileWriter(matFilePath, mlList, true); } catch (Exception ex) { logger?.WriteLineError("Error occured: " + ex.ToString()); return; } logger?.WriteProgress(100.0); logger?.WriteLineInfo("Done."); }
/// <summary> /// Reads <c>miMATRIX</c> from the input stream. /// </summary> /// <remarks> /// If reading was not finished (which is normal for filtered results) /// returns <c>null</c>. /// </remarks> /// <param name="buf">The <c>BinaryReader</c> input stream.</param> /// <param name="isRoot">When <c>true</c> informs that if this is a top level /// matrix.</param> /// <returns><c>MLArray</c> or <c>null</c> if matrix does not match <c>filter</c></returns> private MLArray ReadMatrix( Stream buf, bool isRoot ) { // result MLArray mlArray = null; ISMatTag tag; // read flags int[] flags = ReadFlags( buf ); int attributes = (flags.Length != 0 ) ? flags[0] : 0; int nzmax = ( flags.Length != 0 ) ? flags[1] : 0; int type = attributes & 0xff; // read Array dimension int[] dims = ReadDimension( buf ); // read Array name string name = ReadName( buf ); // If this array is filtered out return immediately if( isRoot && !_filter.Matches(name) ) { return null; } // read data switch (type) { case MLArray.mxSTRUCT_CLASS: MLStructure mlStruct = new MLStructure(name, dims, type, attributes); BinaryReader br = new BinaryReader(buf); // field name length - this subelement always uses the compressed data element format tag = new ISMatTag(br.BaseStream); int maxlen = br.ReadInt32(); // Read fields data as Int8 tag = new ISMatTag(br.BaseStream); // calculate number of fields int numOfFields = tag.Size / maxlen; // padding after field names int padding = (tag.Size % 8) != 0 ? 8 - tag.Size % 8 : 0; string[] fieldNames = new string[numOfFields]; for (int i = 0; i < numOfFields; i++) { byte[] names = new byte[maxlen]; br.Read(names, 0, names.Length); fieldNames[i] = ZeroEndByteArrayToString(names); } br.ReadBytes(padding); // read fields for (int index = 0; index < mlStruct.M * mlStruct.N; index++) { for (int i = 0; i < numOfFields; i++) { // read matrix recursively tag = new ISMatTag(br.BaseStream); if (tag.Size > 0) { MLArray fieldValue = ReadMatrix(br.BaseStream, false); mlStruct[fieldNames[i], index] = fieldValue; } else { mlStruct[fieldNames[i], index] = new MLEmptyArray(); } } } mlArray = mlStruct; //br.Close(); break; case MLArray.mxCELL_CLASS: MLCell cell = new MLCell(name, dims, type, attributes); for (int i = 0; i < cell.M * cell.N; i++) { tag = new ISMatTag(buf); if (tag.Size > 0) { MLArray cellmatrix = ReadMatrix(buf, false); cell[i] = cellmatrix; } else { cell[i] = new MLEmptyArray(); } } mlArray = cell; break; case MLArray.mxDOUBLE_CLASS: mlArray = new MLDouble(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<double>)mlArray).RealByteBuffer, (ByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<double>)mlArray).ImaginaryByteBuffer, (ByteStorageSupport)mlArray); } break; case MLArray.mxUINT8_CLASS: mlArray = new MLUInt8(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<byte>)mlArray).RealByteBuffer, (ByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<byte>)mlArray).ImaginaryByteBuffer, (ByteStorageSupport)mlArray); } break; case MLArray.mxINT8_CLASS: mlArray = new MLInt8(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<byte>)mlArray).RealByteBuffer, (ByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<byte>)mlArray).ImaginaryByteBuffer, (ByteStorageSupport)mlArray); } break; case MLArray.mxUINT64_CLASS: mlArray = new MLUInt64(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<byte>)mlArray).RealByteBuffer, (ByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<byte>)mlArray).ImaginaryByteBuffer, (ByteStorageSupport)mlArray); } break; case MLArray.mxINT64_CLASS: mlArray = new MLInt64(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<byte>)mlArray).RealByteBuffer, (ByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray<byte>)mlArray).ImaginaryByteBuffer, (ByteStorageSupport)mlArray); } break; case MLArray.mxCHAR_CLASS: MLChar mlchar = new MLChar(name, dims, type, attributes); //read real tag = new ISMatTag(buf); char[] ac = tag.ReadToCharArray(); for (int i = 0; i < ac.Length; i++) { mlchar.SetChar(ac[i], i); } mlArray = mlchar; break; case MLArray.mxSPARSE_CLASS: MLSparse sparse = new MLSparse(name, dims, attributes, nzmax); // read ir (row indices) tag = new ISMatTag(buf); int[] ir = tag.ReadToIntArray(); // read jc (column indices) tag = new ISMatTag(buf); int[] jc = tag.ReadToIntArray(); // read pr (real part) tag = new ISMatTag(buf); double[] ad1 = tag.ReadToDoubleArray(); int n = 0; for (int i = 0; i < ir.Length; i++) { if (i < sparse.N) { n = jc[i]; } sparse.SetReal(ad1[i], ir[i], n); } //read pi (imaginary part) if (sparse.IsComplex) { tag = new ISMatTag(buf); double[] ad2 = tag.ReadToDoubleArray(); int n1 = 0; for (int i = 0; i < ir.Length; i++) { if (i < sparse.N) { n1 = jc[i]; } sparse.SetImaginary(ad2[i], ir[i], n1); } } mlArray = sparse; break; default: throw new MatlabIOException("Incorrect Matlab array class: " + MLArray.TypeToString(type)); } return mlArray; }
public static void SaveMatFile() { // create a MATLAB char and double variable and add it to the structure //MLChar scoreName = ; //MLDouble scoreValue = new MLDouble("", new double[] { 12345 }, 1); int maxIter = 0; foreach(ActionData ad in ActionData.actionList) { if(ad.iterationNum > maxIter) { maxIter = ad.iterationNum; } } string dateLbl = ""; dateLbl += System.DateTime.Now.Year.ToString(); dateLbl += System.DateTime.Now.Month.ToString(); dateLbl += System.DateTime.Now.Day.ToString(); dateLbl += System.DateTime.Now.ToFileTimeUtc().ToString(); int chunkSize = 50; int effChunkSize = 50; int chunk = 0; int actionIndex = 0; List<string> fieldList = new List<string> (); fieldList.Add ("obstacle"); fieldList.Add ("goal"); fieldList.Add ("item"); fieldList.Add ("robot"); fieldList.Add ("selectedItem"); while((chunk)*chunkSize < ActionData.actionList.Count) { int i = 0; int ii = 0; actionIndex = chunk*chunkSize; if(chunkSize + actionIndex >= ActionData.actionList.Count) effChunkSize = ActionData.actionList.Count-actionIndex; else effChunkSize = chunkSize; MLStructure structure = new MLStructure("simDat", new int[] { effChunkSize, 1 }); List<MLArray> mlList = new List<MLArray>(); MLDouble arr; while(actionIndex < ActionData.actionList.Count) { ActionData ad = actionList[actionIndex] as ActionData; structure["speed", i] = new MLDouble("", new double[] {maxIter}, 1); structure["beforePos", i] = new MLDouble("", new double[] {ad.beforePos.x,ad.beforePos.y,ad.beforePos.z }, 1); structure["beforeOrient", i] = new MLDouble("", new double[] {ad.beforeOrient.eulerAngles.x,ad.beforeOrient.eulerAngles.y,ad.beforeOrient.eulerAngles.z}, 1); //Debug.Log(dateLbl+"_"+chunk+"["+i+"]" +"("+ad.beforeOrient.x+","+ad.beforeOrient.y+","+ad.beforeOrient.z+")"); structure["afterPos", i] = new MLDouble("", new double[] {ad.afterPos.x,ad.afterPos.y,ad.afterPos.z}, 1); structure["afterOrient", i] = new MLDouble("", new double[] {ad.afterOrient.eulerAngles.x,ad.afterOrient.eulerAngles.y,ad.afterOrient.eulerAngles.z}, 1); structure["robotType", i] = new MLChar("", ad.robotType); structure["itemType", i] = new MLChar("", ad.itemType); ii=0; foreach(string fieldName in fieldList) { int id = ad.positionNames.IndexOf(fieldName); Vector3 vecValue; if(id >= 0) vecValue = ad.positionVecs[id]; else vecValue = new Vector3(100,100,100); // We pass an invalid value structure[fieldName, i] = new MLDouble("", new double[] {vecValue.x,vecValue.y,vecValue.z}, 1); ii++; } i++; actionIndex++; } mlList.Add(structure); MatFileWriter mfw = new MatFileWriter("playDat"+dateLbl+"_"+chunk+".mat", mlList, false); mfw.GetType(); Debug.Log ("Saved (" + chunk + ")playDat" + dateLbl + ".mat"); chunk ++; ActionData.actionList = new List<ActionData>(); } }
public static void writeDOTnirs(core.Data data, string filename, int startIdx = 0, int endIdx = Int32.MaxValue) { // Store the data into the *.nirs matlab format try { int numsamples = data.numsamples; int numch = data.probe.numChannels; int naux = data.auxillaries.Length; numsamples = Math.Min(endIdx - startIdx, numsamples - startIdx); // save the structure as mat file using MatFileWriter List <MLArray> mlList = new List <MLArray>(); double[][] d = new double[numsamples][]; double[][] t = new double[numsamples][]; double[][] aux = new double[numsamples][]; for (int j = startIdx; j < startIdx + numsamples; j++) { double[] dloc = new double[numch]; for (int i = 0; i < numch; i++) { dloc[i] = data.data[i][j]; } try { if (naux > 0) { double[] aloc = new double[naux]; for (int ii = 0; ii < naux; ii++) { aloc[ii] = data.auxillaries[ii].data[j]; } aux[j - startIdx] = aloc; } else { double[] aa = new double[1]; aa[0] = 0; aux[j - startIdx] = aa; } } catch { // Console.WriteLine("error writing aux"); double[] aa = new double[1]; aa[0] = 0; aux[j - startIdx] = aa; } double[] tt = new double[1]; double[] ss = new double[1]; ss[0] = 0; tt[0] = data.time[j]; t[j - startIdx] = tt; d[j - startIdx] = dloc; } MLDouble mldata = new MLDouble("d", d); mlList.Add(mldata); MLDouble mlaux = new MLDouble("aux", aux); mlList.Add(mlaux); MLDouble mltime = new MLDouble("t", t); mlList.Add(mltime); double[][] s = new double[numsamples][]; for (int j = startIdx; j < startIdx + numsamples; j++) { double[] dloc = new double[data.stimulus.Count]; double thistime = data.time[j]; for (int i = 0; i < data.stimulus.Count; i++) { dloc[i] = 0; for (int k = 0; k < data.stimulus[i].onsets.Count; k++) { double onset = data.stimulus[i].onsets[k]; double dur = data.stimulus[i].duration[k]; if (thistime >= onset & thistime <= onset + dur) { dloc[i] = data.stimulus[i].amplitude[k]; } } } s[j - startIdx] = dloc; } MLDouble mls = new MLDouble("s", s); mlList.Add(mls); MLCell condNames = new MLCell("CondNames", new int[] { 1, data.stimulus.Count }); for (int i = 0; i < data.stimulus.Count; i++) { condNames[0, i] = new MLChar(null, data.stimulus[i].name); } mlList.Add(condNames); // Probe MLStructure mlSD = new MLStructure("SD", new int[] { 1, 1 }); List <string> datasubtype = new List <string>(); for (int i = 0; i < data.probe.numChannels; i++) { if (!datasubtype.Contains(data.probe.ChannelMap[i].datasubtype)) { datasubtype.Add(data.probe.ChannelMap[i].datasubtype); } } double[] lambda = new double[datasubtype.Count]; for (int i = 0; i < data.probe.numChannels; i++) { lambda[datasubtype.IndexOf(data.probe.ChannelMap[i].datasubtype)] = data.probe.ChannelMap[i].wavelength; } double[][] srcpos = new double[data.probe.numSrc][]; for (int j = 0; j < data.probe.numSrc; j++) { double[] slo = new double[3]; for (int i = 0; i < 2; i++) { slo[i] = data.probe.SrcPos[j, i]; } slo[2] = 0; srcpos[j] = slo; } double[][] detpos = new double[data.probe.numDet][]; for (int j = 0; j < data.probe.numDet; j++) { double[] dlo = new double[3]; for (int i = 0; i < 2; i++) { dlo[i] = data.probe.DetPos[j, i]; } dlo[2] = 0; detpos[j] = dlo; } mlSD["NumDet", 0] = new MLDouble("", new double[] { data.probe.numDet }, 1); mlSD["NumSrc", 0] = new MLDouble("", new double[] { data.probe.numSrc }, 1); mlSD["Lambda", 0] = new MLDouble("", lambda, 1); mlSD["SrcPos", 0] = new MLDouble("", srcpos); mlSD["DetPos", 0] = new MLDouble("", detpos); if (data.probe.isregistered) { double[][] srcpos3d = new double[data.probe.numSrc][]; for (int j = 0; j < data.probe.numSrc; j++) { double[] slo = new double[3]; for (int i = 0; i < 3; i++) { slo[i] = data.probe.SrcPos3D[j, i]; } srcpos3d[j] = slo; } double[][] detpos3d = new double[data.probe.numDet][]; for (int j = 0; j < data.probe.numDet; j++) { double[] dlo = new double[3]; for (int i = 0; i < 3; i++) { dlo[i] = data.probe.DetPos3D[j, i]; } detpos3d[j] = dlo; } mlSD["SrcPos3D", 0] = new MLDouble("", srcpos3d); mlSD["DetPos3D", 0] = new MLDouble("", detpos3d); } // fixes for HOMER2 mlSD["SpatialUnit"] = new MLChar("", "mm"); // Add demographics as a struct MLStructure demo = new MLStructure("demographics", new int[] { 1, 1 }); for (int i = 0; i < data.demographics.Keys.Count; i++) { object val = data.demographics.get(data.demographics.Keys[i]); string valstr = string.Format("{0}", val); demo[data.demographics.Keys[i], 0] = new MLChar("", valstr); } mlList.Add(demo); double[][] ml = new double[data.probe.numChannels][]; for (int i = 0; i < data.probe.numChannels; i++) { double[] m = new double[4]; m[0] = data.probe.ChannelMap[i].sourceindex + 1; m[1] = data.probe.ChannelMap[i].detectorindex + 1; m[2] = 0; m[3] = 1 + datasubtype.IndexOf(data.probe.ChannelMap[i].datasubtype); ml[i] = m; } MLDouble mlml = new MLDouble("ml", ml); mlList.Add(mlml); mlSD["MeasList", 0] = new MLDouble("", ml); mlList.Add(mlSD); MLStructure mlStim = new MLStructure("StimDesign", new int[] { data.stimulus.Count, 1 }); for (int i = 0; i < data.stimulus.Count; i++) { mlStim["name", i] = new MLChar("", data.stimulus[i].name); double[] onset = new double[data.stimulus[i].onsets.Count]; for (int ii = 0; ii < data.stimulus[i].onsets.Count; ii++) { onset[ii] = data.stimulus[i].onsets[ii]; } double[] dur = new double[data.stimulus[i].duration.Count]; for (int ii = 0; ii < data.stimulus[i].duration.Count; ii++) { dur[ii] = data.stimulus[i].duration[ii]; } double[] amp = new double[data.stimulus[i].amplitude.Count]; for (int ii = 0; ii < data.stimulus[i].amplitude.Count; ii++) { amp[ii] = data.stimulus[i].amplitude[ii]; } mlStim["onset", i] = new MLDouble("", onset, 1); mlStim["dur", i] = new MLDouble("", dur, 1); mlStim["amp", i] = new MLDouble("", amp, 1); } if (data.stimulus.Count > 0) { mlList.Add(mlStim); } new MatFileWriter(filename, mlList, false); } catch { Console.WriteLine("Unable to save .nirs file"); } return; }
/// <summary> /// Reads <c>miMATRIX</c> from the input stream. /// </summary> /// <remarks> /// If reading was not finished (which is normal for filtered results) /// returns <c>null</c>. /// </remarks> /// <param name="buf">The <c>BinaryReader</c> input stream.</param> /// <param name="isRoot">When <c>true</c> informs that if this is a top level /// matrix.</param> /// <returns><c>MLArray</c> or <c>null</c> if matrix does not match <c>filter</c></returns> private MLArray ReadMatrix(Stream buf, bool isRoot) { // result MLArray mlArray = null; ISMatTag tag; // read flags int[] flags = ReadFlags(buf); int attributes = (flags.Length != 0) ? flags[0] : 0; int nzmax = (flags.Length != 0) ? flags[1] : 0; int type = attributes & 0xff; // read Array dimension int[] dims = ReadDimension(buf); // read Array name string name = ReadName(buf); // If this array is filtered out return immediately if (isRoot && !_filter.Matches(name)) { return(null); } // read data switch (type) { case MLArray.mxSTRUCT_CLASS: MLStructure mlStruct = new MLStructure(name, dims, type, attributes); BinaryReader br = new BinaryReader(buf); // field name length - this subelement always uses the compressed data element format tag = new ISMatTag(br.BaseStream); int maxlen = br.ReadInt32(); // Read fields data as Int8 tag = new ISMatTag(br.BaseStream); // calculate number of fields int numOfFields = tag.Size / maxlen; // padding after field names int padding = (tag.Size % 8) != 0 ? 8 - tag.Size % 8 : 0; string[] fieldNames = new string[numOfFields]; for (int i = 0; i < numOfFields; i++) { byte[] names = new byte[maxlen]; br.Read(names, 0, names.Length); fieldNames[i] = ZeroEndByteArrayToString(names); } br.ReadBytes(padding); // read fields for (int index = 0; index < mlStruct.M * mlStruct.N; index++) { for (int i = 0; i < numOfFields; i++) { // read matrix recursively tag = new ISMatTag(br.BaseStream); if (tag.Size > 0) { MLArray fieldValue = ReadMatrix(br.BaseStream, false); mlStruct[fieldNames[i], index] = fieldValue; } else { mlStruct[fieldNames[i], index] = new MLEmptyArray(); } } } mlArray = mlStruct; //br.Close(); break; case MLArray.mxCELL_CLASS: MLCell cell = new MLCell(name, dims, type, attributes); for (int i = 0; i < cell.M * cell.N; i++) { tag = new ISMatTag(buf); if (tag.Size > 0) { MLArray cellmatrix = ReadMatrix(buf, false); cell[i] = cellmatrix; } else { cell[i] = new MLEmptyArray(); } } mlArray = cell; break; case MLArray.mxDOUBLE_CLASS: mlArray = new MLDouble(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <double>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <double>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxSINGLE_CLASS: mlArray = new MLSingle(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <float>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <float>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxUINT8_CLASS: mlArray = new MLUInt8(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <byte>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <byte>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxINT8_CLASS: mlArray = new MLInt8(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <sbyte>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <sbyte>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxUINT16_CLASS: mlArray = new MLUInt16(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <ushort>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <ushort>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxINT16_CLASS: mlArray = new MLInt16(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <short>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <short>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxUINT32_CLASS: mlArray = new MLUInt32(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <uint>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <uint>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxINT32_CLASS: mlArray = new MLInt32(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <int>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <int>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxUINT64_CLASS: mlArray = new MLUInt64(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <ulong>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <ulong>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxINT64_CLASS: mlArray = new MLInt64(name, dims, type, attributes); //read real tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <long>)mlArray).RealByteBuffer, (IByteStorageSupport)mlArray); // read complex if (mlArray.IsComplex) { tag = new ISMatTag(buf); tag.ReadToByteBuffer(((MLNumericArray <long>)mlArray).ImaginaryByteBuffer, (IByteStorageSupport)mlArray); } break; case MLArray.mxCHAR_CLASS: MLChar mlchar = new MLChar(name, dims, type, attributes); //read real tag = new ISMatTag(buf); char[] ac = tag.ReadToCharArray(); for (int i = 0; i < ac.Length; i++) { mlchar.SetChar(ac[i], i); } mlArray = mlchar; break; case MLArray.mxSPARSE_CLASS: MLSparse sparse = new MLSparse(name, dims, attributes, nzmax); // read ir (row indices) tag = new ISMatTag(buf); int[] ir = tag.ReadToIntArray(); // read jc (column indices) tag = new ISMatTag(buf); int[] jc = tag.ReadToIntArray(); // read pr (real part) tag = new ISMatTag(buf); double[] ad1 = tag.ReadToDoubleArray(); int n = 0; for (int i = 0; i < ir.Length; i++) { if (i < sparse.N) { n = jc[i]; } sparse.SetReal(ad1[i], ir[i], n); } //read pi (imaginary part) if (sparse.IsComplex) { tag = new ISMatTag(buf); double[] ad2 = tag.ReadToDoubleArray(); int n1 = 0; for (int i = 0; i < ir.Length; i++) { if (i < sparse.N) { n1 = jc[i]; } sparse.SetImaginary(ad2[i], ir[i], n1); } } mlArray = sparse; break; default: throw new MatlabIOException("Incorrect Matlab array class: " + MLArray.TypeToString(type)); } return(mlArray); }
private static MLCell CreateCellArrayCustom(string name, string[] items) { var cell = new MLCell(name, new int[] { items.Length, 1 }); int i = 0; foreach (var item in items) { double ans = 0; if (double.TryParse(items[i], out ans)) { cell[i] = new MLDouble(null, new double[] { ans }, 1); i++; continue; } cell[i] = new MLChar(null, (string)items[i].Trim()); i++; } return cell; }