Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 12.06.2018
Сообщений: 19

Работа с файлом (матлаб)

26.05.2020, 07:00. Показов 2484. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро.
Суть задания:
Есть файл, измерения спутника(там все возможные данные, не суть). Данные разбиты на эпохи, это сняты измерения с нескольких спутников за 30сек, измерений там на 9часов.
Так вот, необходимо вытащить первые три столбца, разбить на три группы, т.к для 3х спутников, показания вычислений, каждые 30 сек, записывать в формулу через цикл, в конце вывести график зависимости от времени
Будет что-то типо шума, скорее всего
Помогите я завис

На картинке:
P1 - второй столбец
P2 - третий столбец

Первый столбец это номера спутников, нужны 3 любых
Вложения
Тип файла: rar Новая папка.rar (1.27 Мб, 14 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2020, 07:00
Ответы с готовыми решениями:

Работа с матрицами в Матлаб
Добрый день, помогите пожалуйста со следующим вопросом. Есть table 8144*2 следующего вида: При выводе в командном окне данные...

Открыть txt-файл при его формировании в матлаб и сохранении вне матлаб
С помощью операторов fopen, fprintf и fclose в файл "Press.txt" записана текстовая информация : variables={'1.Первый', ' 2.Второй',...

Работа с функцией (или трансляции кода из Си в Матлаб)
Доброго времени суток, столкнулся с необходимостью реализации алгоритма Флёри в Матлаб и начал искать информацию по этому вопросу. Немного...

10
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
26.05.2020, 11:38
Лучший ответ Сообщение было отмечено Xlebushekkkk как решение

Решение

Xlebushekkkk, выбрать нужные данные можно, например, так:
Matlab M
1
2
3
4
5
6
7
8
9
clear; clc;
table = load('svtl_1-10.txt');
num = [1 14 15];
P = cell(1, numel(num));
 
for i = 1:numel(num)
    rows = find(table(:, 1) == num(i));
    P{i}(:, 1:2) = table(rows, 2:3);
end
P - матрица ячеек, каждая ячейка содержит 2 столбца - P1 и P2. num - номера спутников.
1
Модератор
 Аватар для Centurio
1765 / 1610 / 541
Регистрация: 13.09.2015
Сообщений: 5,629
26.05.2020, 17:54
"
Цитата Сообщение от Xlebushekkkk Посмотреть сообщение
разбить на три группы, т.к для 3х спутников
Вот здесь непонятно, по какому критерию вы хотите разбить. Какие спутники туда включать? Только три выбранных и данные с них? Или просто, как идут в таблице, брать первые три, затем следующие три и т.д.?
0
0 / 0 / 0
Регистрация: 12.06.2018
Сообщений: 19
26.05.2020, 18:54  [ТС]
У спутника есть ID - это первый столбец.
Выбираем три спутника например 1й и все данные для первого спутника закинуть в массив, далее еще для двух.

Но потом веселее, измерения в файле разбиты на эпохи, показания снимались каждые 30сек
При заполнении массива это тоже нужно учитывать

Добавлено через 42 секунды
Matlab M
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
clear; clc;
%%
filename = 'svtl_1-10.dat';
fileID = fopen(filename); 
if fileID == -1
   error('File is not opened');
end
j = 1;
%%   
    while feof(fileID) ~= 1  
        line = fgetl(fileID);
%         line = fgetl(fileID);
        k_hour = 1;
        while line(k_hour) ~= ':'
            k_hour = k_hour + 1;
        end        
        block(j).hour = uint16(str2double(line(1 :  k_hour-1)));
        k_minute = k_hour + 1;
        while line(k_minute) ~= ':'
            k_minute = k_minute + 1;
        end        
        block(j).minute = uint16(str2double(line(k_hour+1 : k_minute-1)));
        
        k_sec = k_minute + 1;
        while line(k_sec) ~= '.'
            k_sec = k_sec + 1;
        end        
        block(j).sec = uint16(str2double(line(k_minute+1 : k_sec-1)));
        
        k_kol = k_sec + 1;
        while line(k_kol) ~= ':'
            k_kol = k_kol + 1;
        end        
        block(j).kol = uint16(str2double(line(k_kol+1 : length(line))));
        
        for i = 1:1:block(j).kol
            block(j).data(i) = textscan(fileID,'%f ', 22);
        end  
        
        if j == 1
            interval_monitor.id(1) = block(j).data{1, 1}(1);
            interval_monitor.start_time(1) = 3600*block(j).hour + 60*block(j).minute + block(j).sec;
            kol_id = 1;
        end
        
        for i2 = 1:1:block(j).kol
            metka = 0; 
            for i1 = 1:1:numel(interval_monitor.id)
                if block(j).data{1, i2}(1) == interval_monitor.id(i1);
                    metka = 1; % такой спутник уже есть
                    interval_monitor.finish_time(i1) = 3600*block(j).hour + 60*block(j).minute + block(j).sec;                
                end
            end
            if metka == 0
                kol_id = kol_id + 1; % количество id НКА в interval_monitor
                interval_monitor.id(kol_id) = block(j).data{1, i2}(1);
                interval_monitor.start_time(kol_id) = 3600*block(j).hour + 60*block(j).minute + block(j).sec;                
            end
        end
        
        line = fgetl(fileID);
        j = j + 1;
    end
    fclose(fileID);
    
    j = 1;
    for i = 1:1:kol_id
        interval_monitor.duration(i) = interval_monitor.finish_time(i) -  interval_monitor.start_time(i);
        if interval_monitor.duration(i) >= 3*3600 % если длительность наблюдения НКА больше 3 часов            
            select.id(j) =  interval_monitor.id(i);
            select.start_time(j) =  interval_monitor.start_time(i);
            select.finish_time(j) =  interval_monitor.finish_time(i);
            select.duration(j) =  interval_monitor.duration(i);
            j = j + 1;
        end
    end
    disp('Спутники с интервалом наблюдения больше 3 часов');
    varNames = {'id_NKA';'start_time_monitor';'finish_time_monitor';'duration_time_monitor'};    
    table(select.id.', select.start_time.', select.finish_time.', select.duration.', 'VariableNames',varNames)
       
    c = 0.299792458; %[м/нс] скорость света
    K = (9/7)^2; % константа, связывающая несущие частоты L1, L2 в ГЛОНАСС
    sel_NKA = [1, 4, 5]; % выбор НКА из предыдущей таблицы (номера - порядковый номер строки таблицы)
    for i = 1:1:3
        j1 = 1;
        pred_arg = select.start_time(sel_NKA(i));
        for j = round(select.start_time(sel_NKA(i))/30)+1:1:round(select.start_time(sel_NKA(i)) + 3*3600)/30+1 % выбираем интервалы видимости НКА [(начало наблюдения НКА);(начало наблюдения НКА + 1)]     
            
            for k = 1:1:block(j).kol
                if select.id(sel_NKA(i)) == block(j).data{1, k}(1); % поиск выбранного НКА по id                      
                    NKA(i).Ion_delay_L1(j1) = ((block(j).data{1, k}(3) - block(j).data{1, k}(4)) / c) / (1 - K); % [нс] ионосферная задержка для частоты L1                    
                    NKA(i).Ion_delay_L2(j1) = ((block(j).data{1, k}(3) - block(j).data{1, k}(4)) / c) * K / (1 - K); % [нс] ионосферная задержка для частоты L2                    
                    NKA(i).Ion_delay_arg(j1) = pred_arg; % аргумент; шаг — 30 секунд
                    pred_arg = pred_arg + 30;
                    j1 = j1 + 1;
                    break;
                end
            end
        end
        
        
        subplot(2, 2, i);
        plot(NKA(i).Ion_delay_arg, NKA(i).Ion_delay_L1, NKA(i).Ion_delay_arg, NKA(i).Ion_delay_L2);
        xlabel('Время наблюдения [сек]');
        ylabel('Наклонная ионосферная задержка [нс]');
        title(['НКА id=', num2str(select.id(sel_NKA(i)))]);
        legend('L1','L2')
        grid on;
        xlim([-inf inf]);
        ylim([0 inf]);
        
 
        
%         subplot(3, 2, 2*i-1);
%         plot(NKA(i).Ion_delay_arg, NKA(i).Ion_delay_L1);
%         xlabel('Интервал наблюдения [сек]');
%         ylabel('Наклонная ионосферная задержка [нс]');
%         title(['НКА (id=', num2str(select.id(sel_NKA(i))), ') для L1 ']);
%         grid on;
%         xlim([-inf inf]);
%         ylim([0 inf]);
%         subplot(3, 2, 2*i)
%         plot(NKA(i).Ion_delay_arg, NKA(i).Ion_delay_L2); 
%         xlabel('Интервал наблюдения [сек]');
%         ylabel('Наклонная ионосферная задержка [нс]');
%         title(['НКА (id=', num2str(select.id(sel_NKA(i))), ') для L2 ']);
%         grid on;
%         xlim([-inf inf]);
%         ylim([0 inf]);
 
    end

Это можно упростить, все правильно работает, но нужно проще, прям максимально)
0
Модератор
 Аватар для Centurio
1765 / 1610 / 541
Регистрация: 13.09.2015
Сообщений: 5,629
27.05.2020, 06:52
Xlebushekkkk, всё равно непонятно.
Ладно, выбрать данные для трёх спутников нетрудно. Но как эти данные структурированы по эпохам? Если показания снимались каждые 30 с в течение 9 часов, то это должно быть 1080 групп показаний. Но у вас изначальный массив размером 1968х22. Там никак не выделить 1080 значений.
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
27.05.2020, 13:04
Лучший ответ Сообщение было отмечено Xlebushekkkk как решение

Решение

Xlebushekkkk, немного упростил:
Кликните здесь для просмотра всего текста
Matlab M
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
clear; clc;
 
tab = importfile('svtl_1-10.dat');
ind = [find(isnan(tab(:, 1))); size(tab, 1)+1];
block.hour = [];
block.minute = [];
block.sec = [];
block.kol = [];
block.data = [];
block = repmat(block, 1, numel(ind)-1);
h = 1;
m = 0;
s = 0;
for i = 1:numel(ind)-1
    block(i).hour = h;
    block(i).minute = m;
    block(i).sec = s;
    block(i).kol = ind(i+1) - ind(i) - 1;
    block(i).data = num2cell(tab(ind(i)+1:ind(i+1)-1, :)', 1);
    
    if s == 0
        s = 30;
    else
        s = 0;
        m = m + 1;
        if m == 60
            m = 0;
            h = h + 1;
        end
    end
end
 
num = unique(tab(~isnan(tab(:, 1))), 'stable');
interval_monitor.id = num';
interval_monitor.start_time = zeros(1, numel(num));
interval_monitor.finish_time = zeros(1, numel(num));
interval_monitor.duration = zeros(1, numel(num));
j = 1;
for i = 1:numel(num)
    start = find(tab(:, 1) == num(i), 1, 'first');
    stop = find(tab(:, 1) == num(i), 1, 'last');
    ind1 = nnz(isnan(tab(1:start, 1)));
    interval_monitor.start_time(i) = block(ind1).hour*3600 + block(ind1).minute*60 + block(ind1).sec;
    ind2 = nnz(isnan(tab(1:stop, 1)));
    interval_monitor.finish_time(i) = block(ind2).hour*3600 + block(ind2).minute*60 + block(ind2).sec;
    interval_monitor.duration(i) = interval_monitor.finish_time(i) -  interval_monitor.start_time(i);
    
    if interval_monitor.duration(i) >= 3*3600 % если длительность наблюдения НКА больше 3 часов
        select.id(j) =  interval_monitor.id(i);
        select.start_time(j) =  interval_monitor.start_time(i);
        select.finish_time(j) =  interval_monitor.finish_time(i);
        select.duration(j) =  interval_monitor.duration(i);
        j = j + 1;
    end
end
 
disp('Спутники с интервалом наблюдения больше 3 часов');
varNames = {'id_NKA';'start_time_monitor';'finish_time_monitor';'duration_time_monitor'};
table(select.id.', select.start_time.', select.finish_time.', select.duration.', 'VariableNames',varNames)
 
c = 0.299792458; %[м/нс] скорость света
K = (9/7)^2; % константа, связывающая несущие частоты L1, L2 в ГЛОНАСС
sel_NKA = [1, 4, 5]; % выбор НКА из предыдущей таблицы (номера - порядковый номер строки таблицы)
for i = 1:3
    j1 = 1;
    pred_arg = select.start_time(sel_NKA(i));
    for j = round(select.start_time(sel_NKA(i))/30)+1:1:round(select.start_time(sel_NKA(i)) + 3*3600)/30+1 % выбираем интервалы видимости НКА [(начало наблюдения НКА);(начало наблюдения НКА + 1)]        
        for k = 1:1:block(j).kol
            if select.id(sel_NKA(i)) == block(j).data{1, k}(1) % поиск выбранного НКА по id
                NKA(i).Ion_delay_L1(j1) = ((block(j).data{1, k}(3) - block(j).data{1, k}(4)) / c) / (1 - K); % [нс] ионосферная задержка для частоты L1
                NKA(i).Ion_delay_L2(j1) = ((block(j).data{1, k}(3) - block(j).data{1, k}(4)) / c) * K / (1 - K); % [нс] ионосферная задержка для частоты L2
                NKA(i).Ion_delay_arg(j1) = pred_arg; % аргумент; шаг — 30 секунд
                pred_arg = pred_arg + 30;
                j1 = j1 + 1;
                break;
            end
        end
    end
    
    
    subplot(2, 2, i);
    plot(NKA(i).Ion_delay_arg, NKA(i).Ion_delay_L1, NKA(i).Ion_delay_arg, NKA(i).Ion_delay_L2);
    xlabel('Время наблюдения [сек]');
    ylabel('Наклонная ионосферная задержка [нс]');
    title(['НКА id=', num2str(select.id(sel_NKA(i)))]);
    legend('L1','L2')
    grid on;
    xlim([-inf inf]);
    ylim([0 inf]);
    
    
    
    %         subplot(3, 2, 2*i-1);
    %         plot(NKA(i).Ion_delay_arg, NKA(i).Ion_delay_L1);
    %         xlabel('Интервал наблюдения [сек]');
    %         ylabel('Наклонная ионосферная задержка [нс]');
    %         title(['НКА (id=', num2str(select.id(sel_NKA(i))), ') для L1 ']);
    %         grid on;
    %         xlim([-inf inf]);
    %         ylim([0 inf]);
    %         subplot(3, 2, 2*i)
    %         plot(NKA(i).Ion_delay_arg, NKA(i).Ion_delay_L2);
    %         xlabel('Интервал наблюдения [сек]');
    %         ylabel('Наклонная ионосферная задержка [нс]');
    %         title(['НКА (id=', num2str(select.id(sel_NKA(i))), ') для L2 ']);
    %         grid on;
    %         xlim([-inf inf]);
    %         ylim([0 inf]);
    
end


Функция чтения файла:
Кликните здесь для просмотра всего текста
Matlab M
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
function svtl110 = importfile(filename, dataLines)
%IMPORTFILE1 Import data from a text file
%  SVTL110 = IMPORTFILE1(FILENAME) reads data from text file FILENAME
%  for the default selection.  Returns the numeric data.
%
%  SVTL110 = IMPORTFILE1(FILE, DATALINES) reads data for the specified
%  row interval(s) of text file FILENAME. Specify DATALINES as a
%  positive scalar integer or a N-by-2 array of positive scalar integers
%  for dis-contiguous row intervals.
%
%  Example:
%  svtl110 = importfile1("C:\komonkin\Cyber\New Folder\svtl_1-10.dat", [1, Inf]);
%
%  See also READTABLE.
%
% Auto-generated by MATLAB on 27-May-2020 11:54:05
 
%% Input handling
 
% If dataLines is not specified, define defaults
if nargin < 2
    dataLines = [1, Inf];
end
 
%% Setup the Import Options and import the data
opts = delimitedTextImportOptions("NumVariables", 23);
 
% Specify range and delimiter
opts.DataLines = dataLines;
opts.Delimiter = "\t";
 
% Specify column names and types
opts.VariableNames = ["Nsats7", "VarName2", "VarName3", "VarName4", "VarName5", "VarName6", "VarName7", "VarName8", "VarName9", "VarName10", "VarName11", "VarName12", "VarName13", "VarName14", "VarName15", "VarName16", "VarName17", "VarName18", "VarName19", "VarName20", "VarName21", "VarName22", "VarName23"];
opts.VariableTypes = ["double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double"];
 
% Specify file level properties
opts.ExtraColumnsRule = "ignore";
opts.EmptyLineRule = "read";
 
% Specify variable properties
opts = setvaropts(opts, "VarName23", "TrimNonNumeric", true);
opts = setvaropts(opts, "VarName23", "ThousandsSeparator", ",");
 
% Import the data
svtl110 = readtable(filename, opts);
 
%% Convert to output type
svtl110 = table2array(svtl110);
end


Добавлено через 9 минут
Цитата Сообщение от Centurio Посмотреть сообщение
Но у вас изначальный массив размером 1968х22
Это в txt файле, если глянуть в dat, то там гораздо больше
1
0 / 0 / 0
Регистрация: 12.06.2018
Сообщений: 19
27.05.2020, 19:02  [ТС]
Matlab M
1
2
3
4
Undefined function 'isnan' for input arguments of type 'table'.
 
Error in Kurs (line 6)
ind = [find(isnan(tab(:, 1))); size(tab, 1)+1];
Ругается на isnan
0
0 / 0 / 0
Регистрация: 12.06.2018
Сообщений: 19
27.05.2020, 19:07  [ТС]
Одна эпоха - это снятые измерения за 30 сек
Миниатюры
Работа с файлом (матлаб)  
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
27.05.2020, 19:36
Xlebushekkkk, вы для чтения данных из файла используете функцию, которую я вам скинул (importfile)?
1
0 / 0 / 0
Регистрация: 12.06.2018
Сообщений: 19
27.05.2020, 19:40  [ТС]
Если с Вашей функцией, выдает ошибку
Миниатюры
Работа с файлом (матлаб)  
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
28.05.2020, 11:46
Xlebushekkkk, видимо, у вас старая версия matlab
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2020, 11:46
Помогаю со студенческими работами здесь

GUI Работа с текстовым файлом, лог файлом не мешая системе
Хочу написать прогу которая будет по таймеру искать в тхт - лог файле сообщение об ошибке. Например Error: 100 Qt C++ gui изучаю недавно...

Работа с файлом (корректный код, некорректная работа программы)
Для записи и чтения файла использую разные функции. По одиночке они работают нормально. Вставляю их прототипы в функцию main() и нижняя...

При запуске матлаб через какое-то время физическая память доходит до 100% и матлаб вырубается и происходит дамп
При запуске матлаб через какое-то время физическая память доходит до 100% и матлаб вырубается. При этом в нем не запускаются никакие файлы....

работа со строками в матлаб. Найти сумму всех элементов
дано предложение. Найти сумму всех элементов по критерию a b c d e . . . || || || || || 1 2 3 4 5 . . . ...

Работа с матрицей. Работа с файлом
Обновить в входном файле данные строк/столбцов; выбор строки/столбца и позиция строки/столбца должна вводится с клавиатуры.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru