25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
1
.NET 4.x

Дозапись в binary mat файл

07.11.2016, 19:46. Показов 688. Ответов 12

Привет, заранее прошу прощение, если тема создана не там.
Идея такова. Имеются постоянно прибывающие данные каждую секунду, которые нужно сохранять. После требуется с ними работать в Matlab. В данный момент реализовал только запись в обычный бинарник, а после по требованию весь его считываю в память и пере сохраняю в виде .mat файла. Это не есть правильно. Хотелось бы писать сразу в .mat файл с возможность дозапись в файл. Имеется библиотека для .NET 4.x csmatio. Она позволяет с легкостью записать .mat файл, но нет возможность дозаписать в файл. Единственный выход это вручную формировать бинарный .mat файл. Имеется вроде как даже не большой материал. Но мне очень тяжело в нем разобраться. Может кто сталкивался с подобным и сможет мне помочь?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2016, 19:46
Ответы с готовыми решениями:

Открыть файл matlab.mat в матлабе
Есть файл с лабораторными работами, нужно его открыть и из него вставлять код в программу матлаб...

Дозапись в файл
здравствуйте. я записываю данные в файл ListBox1.Items.SaveToFile('Res.txt'); но при каждом...

Дозапись в файл
Прога на c++. Добавление студентов в базу данных (текстовый файл). Когда записываю, завершаю...

Дозапись в файл
Помогите пожалуйста, с дозаписью не работал. Требуется создать BAT при запуске которого в файл...

12
Эксперт .NET
5341 / 4133 / 1187
Регистрация: 12.10.2013
Сообщений: 11,986
Записей в блоге: 2
07.11.2016, 22:11 2
Цитата Сообщение от timur-chak Посмотреть сообщение
Это не есть правильно.
На мой взгляд, вообще передавать данные между приложениями через запись-чтение файла уже не правильно.
Но это на любителя, естественно.
0
229 / 112 / 79
Регистрация: 17.10.2016
Сообщений: 312
07.11.2016, 22:31 3
Цитата Сообщение от timur-chak Посмотреть сообщение
В данный момент реализовал только запись в обычный бинарник,
Значит что-то уже сделано. Хоть покажите что есть. Что там дописать, какие данные.
Пример файла приведите: до и после. Сжатие не нужно получается ...
Наверняка кто-то сталкивался.
0
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
08.11.2016, 12:17  [ТС] 4
insite2012, да и вы правы, но требовалось считывание данных с устройства. А после уже их обработка в матлабе. Считывание можно было сделать в самом матлабе, но он дико не удобен и медленный для этого.
John999, бинарник просто моего формата, это немного не то, я не особо владею информацией, но якобы можно соблюсти определенную структуру бинарника, что бы получить читаемый mat файл. В этом и вопрос, как это сделать, возможно ли в подобную структуру вообще дозаписывать. Данные для записи это двумерный массив double с N строк и 4 столбца, или матрица Nx4.
0
Эксперт .NET
5341 / 4133 / 1187
Регистрация: 12.10.2013
Сообщений: 11,986
Записей в блоге: 2
08.11.2016, 12:21 5
Цитата Сообщение от timur-chak Посмотреть сообщение
требовалось считывание данных с устройства.
Так считывайте, кто мешает. Я так понимаю, что та программа, которая считывает, и та что обрабатывает - обе ваши? Ну так организуйте очередь, например, MSMQ, читающая читает и кидает сообщения в очередь, а обрабатывающая берет их оттуда по мере необходимости. Очереди (при нужном конфигурировании) вполне устойчивы, можно перегрузить компьютер, и данные, что в ней еще есть, все равно получите.
0
229 / 112 / 79
Регистрация: 17.10.2016
Сообщений: 312
08.11.2016, 13:45 6
Цитата Сообщение от timur-chak Посмотреть сообщение
В этом и вопрос, как это сделать, возможно ли в подобную структуру вообще дозаписывать. Данные для записи это двумерный массив double с N строк и 4 столбца, или матрица Nx4.
Используя вашу библиотеку (та что по ссылке), можно пересоздать файл.
Считывать старую матрицу, добавлять в нее данные. потом сохранять обратно в файл.
Вопрос в другом, реально ли так делать если
Цитата Сообщение от timur-chak Посмотреть сообщение
постоянно прибывающие данные каждую секунду, которые нужно сохранять.
.


Цитата Сообщение от timur-chak Посмотреть сообщение
В этом и вопрос, как это сделать, возможно ли в подобную структуру вообще дозаписывать.
Допустим создали мат файл с матрицей 3х3, примеры смотрел здесьcsmatio/Examples/

C#
1
2
3
4
5
6
7
8
9
    double[][] matrix = new double[3][];
        matrix[0] = new double[] { 100.0, 101.0, 102.0 }; // first row
        matrix[1] = new double[] { 200.0, 201.0, 202.0 }; // second row
        matrix[2] = new double[] { 300.0, 301.0, 302.0 }; // third row
 
        MLDouble mlDoubleArray = new MLDouble("matrix", matrix);
        List<MLArray> mlList = new List<MLArray>();
        mlList.Add(mlDoubleArray);
        MatFileWriter mfw = new MatFileWriter("data3.mat", mlList, false);
Теперь пришли данные в виде такой строки
"-99.0, 8.0, -77.2"

Добавляем данные в матрицу
(считываем старую матрицу из файла, добавляем к ней строку.
была 3х3, стала 4х3. перезаписываем файл)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Globalization;
using csmatio.io;
using csmatio.types;
public class Program
{
    static double[][] GetNewMatrix(double[][] oldMatrix, double[] addArray)
    {
        double[][] newMatrix = new double[oldMatrix.Length + 1][];
        for (int i = 0; i < oldMatrix.Length; i++)
        {
            newMatrix[i] = new double[oldMatrix[i].Length];
            for (int j = 0; j < oldMatrix[i].Length; j++)
            {
                newMatrix[i][j] = oldMatrix[i][j];
            }
        }
        newMatrix[newMatrix.Length - 1] = addArray;
        return newMatrix;
    }
 
 
    static void Main(string[] args)
    {
        string received = "-99.0, 8.0, -77.2";
        double[][] oldMatrix = null;
        string[] arrStr = received.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
        double[] doubles = Array.ConvertAll(arrStr, delegate (string s) { return Double.Parse(s, CultureInfo.InvariantCulture); });
 
        // create a reader for the file 
        MatFileReader mfr = new MatFileReader("data3.mat");
 
        // get a reference to our matlab 'squares' double matrix 
        MLDouble mlSquares = (mfr.Content["matrix"] as MLDouble);
        if (mlSquares != null)
        {
            Console.WriteLine("old matrix : ");
            // now get the double values 
            oldMatrix = mlSquares.GetArray();
            foreach (double[] row in oldMatrix)
            {
                Console.WriteLine();
                foreach (double col in row)
                    Console.Write(col + " ");
            }
        }
        Console.WriteLine();
        Console.WriteLine("\nnew matrix : ");
        double[][] newMatrix = GetNewMatrix(oldMatrix, doubles);
        foreach (double[] row in newMatrix)
        {
            Console.WriteLine();
            foreach (double col in row)
                Console.Write(col + " ");
        }
         // пересохраняем файл
        MLDouble mlDoubleArray = new MLDouble("matrix", newMatrix);
        List<MLArray> mlList = new List<MLArray>();
        mlList.Add(mlDoubleArray);
        MatFileWriter mfw = new MatFileWriter("data3.mat", mlList, false);
        Console.ReadKey(true);
    }
}
out:

old matrix :

100 101 102
200 201 202
300 301 302

new matrix :

100 101 102
200 201 202
300 301 302
-99 8 -77,2
1
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
08.11.2016, 16:12  [ТС] 7
John999, Спасибо за ваш ответ, но ситуация такая, что память не резиновая, и чем больше данных тем больше матрица, которую мы перезаписываем, а размер ее достигаем десятка миллионов отсчетов.

Добавлено через 3 минуты
insite2012, Интересная тема для размышления. Но имеется ввиду работа с записями, ибо запись и обработка производится в разное время. В один день запись данных, после в спокойной обстановке уже их обработка. Плюс есть нюанс, что запись производится на слабок ПК, ибо ПК полевой и его вычислительной возможности не хватит на обработку. Вопрос стоит только в более удобной компоновке данных.
0
Эксперт .NET
5341 / 4133 / 1187
Регистрация: 12.10.2013
Сообщений: 11,986
Записей в блоге: 2
08.11.2016, 16:23 8
Цитата Сообщение от timur-chak Посмотреть сообщение
запись и обработка производится в разное время. В один день запись данных, после в спокойной обстановке уже их обработка.
Хм... Именно для этого и предназначены очереди MSMQ.
0
229 / 112 / 79
Регистрация: 17.10.2016
Сообщений: 312
08.11.2016, 16:27 9
Цитата Сообщение от timur-chak Посмотреть сообщение
но ситуация такая, что память не резиновая,
timur-chak, понял ) .
Хотел посмотреть что там за библиотека.
Цитата Сообщение от timur-chak Посмотреть сообщение
а размер ее достигаем десятка миллионов отсчетов.
вот про это и спрашивал.
0
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
08.11.2016, 17:01  [ТС] 10
insite2012, Я видимо до конца не понял как это работает, на разные ПК это будет работать?
0
Эксперт .NET
5341 / 4133 / 1187
Регистрация: 12.10.2013
Сообщений: 11,986
Записей в блоге: 2
08.11.2016, 17:05 11
Цитата Сообщение от timur-chak Посмотреть сообщение
на разные ПК это будет работать?
Да, при должном конфигурировании - вполне. Почитайте про MSMQ
0
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
08.11.2016, 17:12  [ТС] 12
insite2012, суть я примерно понял, но проблема в том, что пк на котором производятся записи и на котором после ведется обработка изолированны друг от друга. Единственный возможный способ передачи, это флешка.
0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
08.11.2016, 17:56 13
Цитата Сообщение от timur-chak Посмотреть сообщение
Единственный возможный способ передачи, это флешка.
А интернет?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2016, 17:56

Дозапись в файл
всем доброго времени суток! не получается дозаписать в конец файла. открываю и считываю таким вот...

Дозапись в файл
Есть код: ofstream file; file.open(&quot;rec.txt&quot;); streambuf* sbuf = cout.rdbuf();...

Дозапись в файл
Подскажите плиз, почему у меня значения постоянно друг на друга переписываются в файле..в...

Дозапись в файл
Здравствуйте. Подскажите пожалуйста, как на нажатие кнопки производить дозапись в файл значения...

Дозапись в файл
После выполнения программы, результат выписывается в текстовый файл. Если же запустить программу...

Дозапись в xml файл
пишу на консоле и не знаю, как сделать, чтобы добавлять новых и новых студентов в xml файл, все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.