Как предотвратить октаву, принимающую пустые записи как нули в csvread? - PullRequest
1 голос
/ 13 октября 2019

У меня есть CSV-файл, содержащий много столбцов x и y, которые я хочу построить на одном графике. Однако количество точек данных в разных столбцах различно, и эти пустые значения представлены запятыми в файле CSV, и Octave принимает их за (ноль, ноль).

Как игнорировать пробелы?

Это такой файл CSV (столбцы обозначают x1, y1, x2, y2)

0.59,0.09,1.12,0.106
0.23,0.09,0.88,0.104
,,0.02,0.105

Это код октавы

function getdata()
M = csvread("filename.csv");
x1 = M(:,1);
y1 = M(:,2);
x2 = M(:,3);
y2 = M(:,4);
figure 1;
plot(x1,y1, "or", x2,y2, "*")

Это сюжетЯ получил. Обратите внимание, что в (0,0) есть точка данных, которую я не хочу. enter image description here

1 Ответ

2 голосов
/ 14 октября 2019

Если вы посмотрите на справку для csvread, вы увидите, что это просто оболочка для dlmread.

Эта функция эквивалентна

X = dlmread (FILENAME, "," , DLM_OPT1, ...)

Любые необязательные аргументы передаются непосредственно в 'dlmread'

Справка dlmread описывает необязательнуюпараметр 'emptyvalue', позволяющий указать, что будет сделано с пустой записью в файле.

-- DATA = dlmread (FILE, SEP, RANGE)
-- DATA = dlmread (..., "emptyvalue", EMPTYVAL)

...

Параметр emptyvalue может использоваться дляукажите значение, используемое для заполнения пустых полей. По умолчанию это ноль. Обратите внимание, что любые нечисловые значения, такие как текст, также заменяются на «пустое значение».

Используя этот параметр, вы можете вставить любое желаемое числовое значение. Сюда входят такие значения, как Inf и NaN, которые можно использовать для фильтрации данных перед построением графика, если это именно то, что вы хотите сделать.

>> dlmread('testdata.dat')
ans =

   0.59000   0.09000   1.12000   0.10600
   0.23000   0.09000   0.88000   0.10400
   0.00000   0.00000   0.02000   0.10500

>> dlmread('testdata.dat','emptyvalue',999)
ans =

     0.590000     0.090000     1.120000     0.106000
     0.230000     0.090000     0.880000     0.104000
   999.000000   999.000000     0.020000     0.105000

>> dlmread('testdata.dat','emptyvalue',inf)
ans =

   0.590000   0.090000   1.120000   0.106000
   0.230000   0.090000   0.880000   0.104000
        Inf        Inf   0.020000   0.105000

>> dlmread('testdata.dat','emptyvalue',nan)
ans =

   0.590000   0.090000   1.120000   0.106000
   0.230000   0.090000   0.880000   0.104000
        NaN        NaN   0.020000   0.105000

Похоже, что команда plot игнорирует как NaN, так и inf,Для этого я бы рекомендовал NaN.

>> M = dlmread('testdata.dat','emptyvalue',nan)
M =

   0.590000   0.090000   1.120000   0.106000
   0.230000   0.090000   0.880000   0.104000
        NaN        NaN   0.020000   0.105000

>> x1 = M(:,1); y1 = M(:,2); x2 = M(:,3); y2 = M(:,4);
>> plot(x1,y1,"or", x2,y2,"*") 

plot with blanks as NaN

...