2015-06-24 3 views
0

Я пытаюсь импортировать файл * .txt с атрибутами, разделенными comas, всегда чередуя атрибут (который является числом) со значением (double), например [128 0.4325 129 0.4568 ] - где 128 означает хорошие данные, а 129 означает плохие данные. У меня есть 31 файл (31 день в месяц) с 1465-1477 строками (количество минут в день, но иногда происходит сбой, поэтому количество строк может меняться).Как импортировать и экспортировать в Matlab

После прочтения, я хочу сделать некоторые простые вычисления и дать разные атрибуты в зависимости от каждого случая, но всегда строку, такую ​​как «? S», «II», «X» (поэтому я не могу просто дать NaN).

Что я делаю:

%read file 
caminho = 'C:\Users\nery.neto\Desktop\05'; 
CurrentDir = dir(fullfile(caminho,'*.wad')); 
%parameters below 
Temperatura=zeros(1470,31);CO=zeros(1470,31);NO=zeros(1470,31);NO2=zeros(1470,31); 
NOx=zeros(1470,31);SO2=zeros(1470,31);PTS=zeros(1470,31);PM10=zeros(1470,31); 
PM25=zeros(1470,31);VV=zeros(1470,31);DV=zeros(1470,31); 
for i=1:size(CurrentDir,1) 
[fid, errormsg] = fopen([caminho '\' CurrentDir(i,1).name],'r+'); 
nCols = 23; 
format_aux = repmat(' %f32 %s', [1 nCols]); 
format=['%s %s %s' format_aux] ; %before alternating attributes and values,there are 3 columns with strings 
A1(i,:) = textscan(fid,format,'delimiter',',','headerLines', 2); 
clear fid errormsg 
%exemplifying with "Temperatura", but the same is done with the other parameters 
Parametros.Temperatura{i,2}=[datenum(A1{i,3}) A1{i,4}]; 
Parametros.Temperatura{i,1}=A1{i,5}; 
Temperatura(1:size(A1{i,4},1),i)=[A1{i,4}]; 
end 
%now I find repeated values, values=9999, negative values, difference between some...this part works well, but I had to create the double variables instead of working with the struct, because I couldn't either use the find command or the eval function properly 
[linha_temp coluna_temp]=find(Temperatura==-9.999 | Temperatura==-9999 ... 
| Temperatura==9999); 
[linha_co coluna_co]=find(CO==-9.999 | CO==-9999 | CO==9999); 
[linha_dv coluna_dv]=find(DV==-9.999 | DV==-9999 | DV==9999); 
[linha_no coluna_no]=find(NO==-9.999 | NO==-9999 | NO==9999); 
[linha_no2 coluna_no2]=find(NO2==-9.999 | NO2==-9999 | NO2==9999); 
[linha_nox coluna_nox]=find(NOx==-9.999 | NOx==-9999 | NOx==9999); 
[linha_pm10 coluna_pm10]=find(PM10==-9.999 | PM10==-9999 | PM10==9999); 
[linha_pm25 coluna_pm25]=find(PM25==-9.999 | PM25==-9999 | PM25==9999); 
[linha_pts coluna_pts]=find(PTS==-9.999 | PTS==-9999 | PTS==9999); 
[linha_so2 coluna_so2]=find(SO2==-9.999 | SO2==-9999 | SO2==9999); 
[linha_vv coluna_vv]=find(VV==-9.999 | VV==-9999 | VV==9999); 
%In this part I try to export the data, but I just can't by this way 
Parametros.Temperatura{coluna_no_rep,1}(linha_no_rep,1)='?S' 

Я получаю результат:

??? Scalar cell array indices required in this assignment. 

Что я делаю неправильно?

+0

Какая строка вызывает ошибку? – Daniel

+0

Daniel, в последнем:% В этой части я пытаюсь экспортировать данные, но я просто не могу таким образом Parametros.Temperatura {coluna_no_rep, 1} (linha_no_rep, 1) = '? S' –

+0

Вы можете Не используйте двойную индексацию в Matlab. Сначала нужно создать массив, а затем вставить его в ячейку. – Daniel

ответ

0

Я предполагаю, что coluna_no_rep является либо логическим, либо массивом, определяющим более одного индекса. Оба могут привести к ошибкам.

Вот минимальный пример получения этой ошибки.

cell = {magic(2),'hello';[2 4 6;7 8 9],'world'}; 
cell{[1 2],1}(1,2) = [5 6]; 

, который дает ошибку Scalar cell array indices required in this assignment. Причиной этого является то, что MATLAB (насколько я знаю) не может присваивать значения двух разных массивов одновременно. Вместо этого вы могли бы написать:

cell = {magic(2),'hello';[2 4 6;7 8 9],'world'}; 
cell{1,1}(1,2) = 5; 
cell{2,1}(1,2) = 6; 

который работает без ошибок. MATLAB иногда выплевывает ту же ошибку, когда вы пытаетесь получить доступ к ячейке, используя логическую индексацию. Попробуйте

cell = {magic(2),'hello';[2 4 6;7 8 9],'world'}; 
i = logical([1 1]); 
cell{i,1}(1,2) = [5;6]; 

дает ошибку Scalar cell array indices required in this assignment. Опять же, это потому, что вы пытаетесь получить доступ к более чем один массив.

Попробуйте заменить coluna_no_rep на одиночный целочисленное значение, соответствующее интересующему индексу. Если вам нужно назначить '?S' нескольким массивам, вам, вероятно, понадобится цикл for или переопределить Parametros.Temperatura в некотором роде.

+0

Delyle, coluna_no_rep - это индексы для команды find, поэтому они двойные. Но спасибо вам в любом случае! –

+0

@NeryNeto, я вижу. Я думаю, проблема заключается в том, что 'coluna_no_rep' является _list_ of _indices_. В этом задании вам необходимо присваивать значение «? S» _one_ index в ячейке за раз. – Delyle

Смежные вопросы