Hello!
I have a problem where I need to remove som rows from a matrix. I need to remove all numbers under 10 and over 60 from the first row and all negative numbers from the second row. The third row has to be between 1:4. I need to print if a row has been removed, so I know which rows are missing, which I haven't implemented in the code below. I have tried in many ways and has come up with this that removes the right rows, but I am sure it can be done in a smarter way…
clc;clear; false_data = [8 20 15 35 65 35; 0.1090 -0.50 0.5170 1.0860 0.9340 0.1090;1 2 3 4 6 1]'; approved_bacteria = [1 2 3 4];
for i = 1:length(false_data(:,1)) indices = 10 > false_data(:,1) | (false_data(:,1) > 60)
false_data(indices,:) = []; end
for i = length(false_data(:,2)) indices = false_data(:,2) < 0; false_data(indices,:) = []; end
for i = length(false_data(:,3)) indices = false_data(i,3) < 1 false_data(i,3) > 4; false_data(indices,:) = []; end false_data

 Respuesta aceptada

Sean de Wolski
Sean de Wolski el 31 de Oct. de 2014

0 votos

This is how I'd do it.
% Bounds
lb = [10 0 1];
ub = [60 inf 4];
% Simulate data
n = 1000;
data = [randi(100,[n,1]) randn(n,1) rand(n,1)*10];
% Apply conditions
idxrmv = any(bsxfun(@lt,data,lb) | bsxfun(@gt,data,ub),2);
% Remove
data(idxrmv,:) = [];
% print
fprintf('Removed row %3.0i\n',find(idxrmv));

5 comentarios

Jakob Hannibal
Jakob Hannibal el 31 de Oct. de 2014
This is really great, thanks! Can it be done so that i can print the column number also. Something like Removed column 1 row 5?
Sean de Wolski
Sean de Wolski el 31 de Oct. de 2014
Like which column(s) caused the row to fail?
The information is here:
You could loop over this and check which columns are true
bsxfun(@lt,data,lb) | bsxfun(@gt,data,ub)
Jakob Hannibal
Jakob Hannibal el 31 de Oct. de 2014
I have to explain in which line the error occurred and what error was. I will try a loop
Sean de Wolski
Sean de Wolski el 31 de Oct. de 2014
loop over the rows of the matrix, find the columns in each row, print.
Jakob Hannibal
Jakob Hannibal el 4 de Nov. de 2014
When I run the function I get this errormessage:
Enter the filename to load: data0.txt
data =
25.0000 0.1090 1.0000
20.0000 0.0960 2.0000
100.0000 0 3.0000
15.0000 0.8000 5.0000
35.0000 1.0860 4.0000
40.0000 0.9340 2.0000
35.0000 0.1090 1.0000
22.0000 0.1000 1.0000
21.0000 0.1000 2.0000
16.0000 0.6000 3.0000
17.0000 0.8500 5.0000
32.0000 1.0800 4.0000
45.0000 0.9500 2.0000
37.0000 0.1100 1.0000
Error using bsxfun Non-singleton dimensions of the two input arrays must match each other.
Error in checkdata (line 10) idxrmv = any(bsxfun(@lt,data,lb) | bsxfun(@gt,data,ub),2);

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Loops and Conditional Statements en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 31 de Oct. de 2014

Comentada:

el 4 de Nov. de 2014

Community Treasure Hunt

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

Start Hunting!

Translated by