MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
Asked by Jenny on 26 Sep 2013

I have a 84761 x 8 matrix (see attached file as an example of data from the matrix).

I would like to extract all of the rows of data where the month (3rd column) = 11, 12, 1, 2 and 3.

I have set the 'months' to look for in an array called WinterMonths.

I am trying to loop through the matrix (EditedWindTempMatrix) and write all of the data where the month = a 'winter' month to a new matrix.

The 'for loop' loops through the 5 'winter' months.

My problem lies in coding the if loop. i.e. extract the data and write it to a new matrix if the condition is true.

How do I index the new matrix (called WinterWTMatrix) to write the data from the matrix with all the data (EditedWindTempMatrix) to the new matrix only when the condition specified is true?

WinterMonths = [11 12 1 2 3]; % 1 x 5 array

for k = 1:length(WinterMonths); MonthIdx=WinterMonths(k); if EditedWindTempMatrix(:,3)==MonthIdx; WinterWTMatrix=EditedWindTempMatrixdata;

end end

I know that I am not correctly extracting the data from the EditedWindTempMatrix and not correctly writing it to the WinterWTMatrix but I am not sure how to do this.

(I can do it column by column but wanted a more efficient way to extract the desired data).

*No products are associated with this question.*

Answer by Image Analyst on 26 Sep 2013

Edited by Image Analyst on 26 Sep 2013

Accepted answer

Jenny:

Use ismember:

% Create sample data: %EditedWindTempMatrix = randi(12, 10,3) % Define which months are winter. WinterMonths = [11 12 1 2 3]; % 1 x 5 array

% Find out which rows are winter. rowsToExtract = ismember(EditedWindTempMatrix(:, 3), WinterMonths) % Get those rows from the original matrix WinterData = EditedWindTempMatrix(rowsToExtract,:)

Answer by Simon on 26 Sep 2013

Edited by Simon on 26 Sep 2013

Hi!

Search the third column for your desired month

irows = (EditedWindTempMatrix(:,3) == 11) | ... (EditedWindTempMatrix(:,3) == 12) | ... (EditedWindTempMatrix(:,3) == 1) | ... (EditedWindTempMatrix(:,3) == 2) | ... (EditedWindTempMatrix(:,3) == 3);

Then "irows" is a logical array of length of size(1) of EditedWindTempMatrix. Then

WinterWTMatrix = EditedWindTempMatrix(irows, :);

Simon on 26 Sep 2013

Yes, 'or' ('|') instead of 'and' ('&'). You're right. I corrected it above.

Your solution looks better than mine. But I experience with "ismember" a slower execution, especially if I use it with full 2d arrays and not with just a column like in this example. But that's another problem.

## 0 Comments