How to find the indices of a data column that aren't Nan, and how to use those indices to concatenate a vector?

3 ビュー (過去 30 日間)
My code is using importdata to import the data columns from excel files. I have a bunch of data files that I have a for loop going through and I am trying to make contiuous vectors of all the data from all the files. In the data files, Mx, My, Mz and Temp are somethimes empty and I want to make those vectors without the nans that will appear where there is nothing in the data file.
The second line of the first peice of code I have written is what I have guessed is a way to find the postions where there arent nans and then use that indice in the line that concatenates the Mx vector (I assumed I would have to do this for Mx, My, Mz and Temp individually and I havent written those there), but this function won't produce outputs for each line that isnt a nan, I always get an error that says there are to many output arguments. Is there a way to do this using this function or should I try something else?
elseif size(A.data,2) == 15
[~,i] = not(isnan(A.data(:,12)));
Time = [Time;(A.data(:,1) + mtimeStart*24*60*60)];
Ax = [Ax;A.data(:,2)];
Ay = [Ay;A.data(:,3)];
Az = [Az;A.data(:,4)];
Mx = [Mx;A.data(i,12)];
My = [My;A.data(:,13)];
Mz = [Mz;A.data(:,14)];
Temp = [Temp;A.data(:,15)];
TimeMag = [TimeMag;(A.data(:,1) + mtimeStart*24*60*60)];
TimeTemperature = [TimeTemperature;(A.data(:,1) + mtimeStart*24*60*60)];
%% full code
N = length(fns);
Time=[];
Ax=[];
Ay=[];
Az=[];
Mx=[];
My=[];
Mz=[];
Temp=[];
TimeMag=[];
TimeTemperature=[];
times=[];
temperatureTimes=[];
magTimes=[];
for kk = 1:1:N
fn = fns(kk).name;
A = importdata([dn,fn]);
%find time stamps
start_time = A.textdata(3,1);
str = char(start_time);
S = strfind(str,' '); %finds the spaces
DateandTime = extractAfter(str,S(1));
DT = datetime(DateandTime,'InputFormat','yyyy-MM-dd,HH:mm:ss.SSS');
startTime = timeofday(DT);
mtimeStart = datenum(DT);
if size(A.data,2) == 11
Time = [Time;(A.data(:,1) + mtimeStart*24*60*60)];
Ax = [Ax;A.data(:,2)];
Ay = [Ay;A.data(:,3)];
Az = [Az;A.data(:,4)];
for ii = 1:1:size(A.data,1)
numNan(ii) = sum(isnan(A.data(ii,:)));
% if nans in row then it is slow magnetometer data
if sum(isnan(A.data(ii,:))) == 7 %Mx, My, Mz, Temp
Mx = [Mx;A.data(ii,1)];
My = [My;A.data(ii,2)];
Mz = [Mz;A.data(ii,3)];
Temp = [Temp;A.data(ii,4)];
TimeMag = [TimeMag;(A.data(ii-1,1) + mtimeStart*24*60*60)];
TimeTemperature = [TimeTemperature;(A.data(ii-1,1) + mtimeStart*24*60*60)];
elseif sum(isnan(A.data(ii,:))) == 8 %Mx, My, Mz
Mx = [Mx;A.data(ii,1)];
My = [My;A.data(ii,2)];
Mz = [Mz;A.data(ii,3)];
TimeMag = [TimeMag;(A.data(ii-1,1) + mtimeStart*24*60*60)];
end
end % ii
elseif size(A.data,2) == 15
Time = [Time;(A.data(:,1) + mtimeStart*24*60*60)];
Ax = [Ax;A.data(:,2)];
Ay = [Ay;A.data(:,3)];
Az = [Az;A.data(:,4)];
Mx = [Mx;A.data(:,12)];
My = [My;A.data(:,13)];
Mz = [Mz;A.data(:,14)];
Temp = [Temp;A.data(:,15)];
TimeMag = [TimeMag;(A.data(:,1) + mtimeStart*24*60*60)];
TimeTemperature = [TimeTemperature;(A.data(:,1) + mtimeStart*24*60*60)];
elseif size(A.data,2) == 14
Time = [Time;(A.data(:,1) + mtimeStart*24*60*60)];
Ax = [Ax;A.data(:,2)];
Ay = [Ay;A.data(:,3)];
Az = [Az;A.data(:,4)];
Mx = [Mx;A.data(:,12)];
My = [My;A.data(:,13)];
Mz = [Mz;A.data(:,14)];
TimeMag = [TimeMag;(A.data(:,1) + mtimeStart*24*60*60)];
for ii = 1:1:size(A.data,1)
numNan(ii) = sum(isnan(A.data(ii,:)));
if sum(isnan(A.data(ii,:))) == 13 %T
Temp = [Temp;A.data(ii,1)];
TimeTemperature = [TimeTemperature;(A.data(ii-1,1) + mtimeStart*24*60*60)];
end
end % ii
else
%display error message
disp(['Uh-oh ',num2str(kk),' ', fn])
end %dealing with width differences in data
end %kk

採用された回答

Rik
Rik 2019 年 5 月 27 日
The not function (or simply ~) doesn't have a second output. Luckily you don't need it. You can directly use its output to perform a logical indexing operation.
You might want to combine each of your 3 variables filter list with or (use a single pipe |) to keep all variables aligned.
  2 件のコメント
Rik
Rik 2019 年 5 月 31 日
Did this suggestion solve your problem? If so, please consider marking it as accepted answer. It will make it easier for other people with the same question to find an answer. If this didn't solve your question, please comment with what problems you are still having.
Grace
Grace 2019 年 5 月 31 日
Thank you! Using what I named the ~isnan function to indicate the row worked!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by