Parsing an array A based on trigger data in array B ?

2 vues (au cours des 30 derniers jours)
Katie
Katie le 3 Juil 2013
Hi everyone!
I have what should be a simply question but I cannot seem to find an effective solution. I have two columns of data in Excel files that I read into Matlab, at the moment as two separate arrays (column A and B).
Column A contains numeric data and Column B is a trigger stamp for the data in A. Example:
What I need to do is to parse A and split it into a number of (30) arrays depending on the trigger point in B i.e. the very large A would become A1, A2, A3 ... A30, split according to when there is a data-stamp in B.
  2 commentaires
Jan
Jan le 3 Juil 2013
Please post how you "read the Excel file". Then creating a matching answer is easier.
Katie
Katie le 3 Juil 2013
Modifié(e) : Katie le 3 Juil 2013
Hi Jan,
I was just crudely reading from the excel file and writing the columns to vectors, but I have switched to reading a cdv instead as Chad suggested, much neater. My trouble is how to split the matrix based on the second column (or B in my earlier version) that is causing the difficulty. Thanks.
[OLD version, reading from Excel] A=xlsread('file.xls','A:B'); rows=sizem(1); % Assigning the columns to vectors for i=1:1:rows if(~isnan(A(i,1))) signal(i)=A(i,1); end end etc.

Connectez-vous pour commenter.

Réponse acceptée

Chad Gilbert
Chad Gilbert le 3 Juil 2013
If I save similar data out as a .csv file:
A,B
1.303,1
1.61,
4,2
1.213,
and then read them in with:
>> a = csvread('a.csv',1,0)
I get a matrix the same shape as your data, with 0's filling all the empty spots:
a =
1.3030 1.0000
1.6100 0
4.0000 2.0000
1.2130 0
This will be pretty easy to parse into a cell array of arrays.
  3 commentaires
Chad Gilbert
Chad Gilbert le 3 Juil 2013
Modifié(e) : Chad Gilbert le 3 Juil 2013
Ah, I see. I thought your trouble was with reaading. To split it up, Rob's answer ought to work. Or a shorter version might be:
ind = [find(a(:,2)>0); size(a,1)+1];
b = arrayfun(@(i)a(ind(i):ind(i+1)-1),1:length(ind)-1,'uniformoutput',false)
Katie
Katie le 3 Juil 2013
Hi Chad, and Rob!
I tried Chad's first as I had already switched to using a matrix 'a'. This works brilliantly, thank you both. The only thing that is wrong at the moment with it is that it populates b with 29 vectors, not 30. It misses the first one every time. I might just be missing something simple.
I can see in the workspace that 'b' is a 1 x 29 matrix now. If I want to write this out to a new file I'm guessing I have to do more with it?
Thank you both again, much appreciated!

Connectez-vous pour commenter.

Plus de réponses (1)

Rob
Rob le 3 Juil 2013
Modifié(e) : Rob le 3 Juil 2013
I'm sure there are more elegant solutions, but here's one way:
idx1 = find(~isnan(B));
idx2 = [idx1(2:end)-1; length(A)];
C = cell(length(idx1), 1);
for k = 1:length(idx1)
C{k} = A(idx1(k):idx2(k));
end
If the non trigger values in B are zeros then:
idx1 = find(B>0);
-Rob

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by