How do I delete an entire row if a specific column contains a zero?

Right, so I'm new to MATLAB, but what I have is a large data set (10074x4), the second column of which is a binary code, so whenever theres a zero in that column I want to delete the entire row. Any tips on how to go about doing this? Thanks

 Accepted Answer

Many ways in MATLAB. One way:
%create some data
X = ones(20,2);
X(1:10,2) = 0;
indices = find(X(:,2)==0);
X(indices,:) = [];
Wayne

4 Comments

Thanks Wayne, as I'm still getting started with MATLAB, would you mind explaining what each of those steps does? Thanks
indices = find(X(:,2)==0);
% find all row indices in the second column of your matrix X that are equal to % zero
X(indices,:) = [];
% get rid of all the rows in X that correspond to the row indices you found
% in the step before
Note that in general find(y==some_value) can be tricky in a computer but in this instance since you are looking for zero, I think you're ok. More about that later.
Thanks! Now I follow you, thanks again!

Sign in to comment.

More Answers (1)

X = X(logical(X(:,2)),:);
straight conversion to logical will be faster. It is advised to avoid using find and to use logical indexing whenever possible.
Breaking the above into steps, I keep all of rows in which X(:,2) converted to logical (0 = 0,everything else = 1).

10 Comments

Well that seems tremendously efficient (worked perfectly), could you perhaps run how that works by me one more time? I follow the base logic of converting it then deleting the rows with the zeros, I'm just wondering how that is explained by that code...
-taking Wayne's X matrix.
-we convert the second column to a logical vector, i.e. if it's _exactly_ 0 it stays logical (binary) zero (aka false), if it's anything else, it becomes logical one (binary true).
logical(X(:,2))
-Then we extract the rows with a logical one and their corresponding columns in the reassignment to X, the rows with a logical false are tossed.
Right, I guess I was more wondering if I wanted to do each of those steps individually (convert column to logical, delete 0's, then bring back to "normal" format (not logical)), how would I type those out? (Im just trying to learn all the various ins and outs of MATLAB)
X = Waynes_matrix;
index2keep = logical(X(:,2)); %logical second column
X = X(index2keep,:);
Let's say it was something more difficult, e.g. the first column has to equal three and the second column has to be less than pi:
index2keep = X(:,1)==3 & X(:,2) < pi; %first column equal to three and second column less than pi.
X = X(index2keep,:);
The best way is just to keep programming. Get a working solution and then ask us/the documentation how to make it better. And of course ask us when you have a specific operation like this, that appears it could be optimized.
Awesome, that was exactly what I was looking for, cleared a lot up, thanks! No doubt I'll be back for more help as the situation warrants it
This worked perfectly for me, too. Thanks very much.
I know this is a dead thread, but this worked great for me too. It made it so easy to delete any rows in which my first column had a 0. But, how could I do this for a multidimensional matrix? For example, as a single matrix my working code is:
Data = Data(logical(Data(:,1)),:);
but now I need it to do this for 12 other matrices within a for loop. The code I currently have is:
subjects = 12; for sub = 1:subjects
sheet = ['Sheet' num2str(sub)];
Data(:,:,sub) = xlsread('801 Matlab Test.xlsx',sheet);
Data(:,:,sub) = Data(logical(Data(:,1,sub)),:,sub);
end
and I get an error of dimension mismatch. Any ideas?
I'm new to MATLAB, I want to delete the entire rows and columns which contain all of ones in a binary image.I want to keep rows and columns if that contain only single zero. Any tips on how to go about doing this? Thanks
>> binaryimage
binaryimage =
33×35 logical array
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1
1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1
1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1
1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1
1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 1
1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1
1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1
1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1
1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1
1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1
1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1
1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1
1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
I want to remove rows and columns that contains all of ones

Sign in to comment.

Tags

No tags entered yet.

Community Treasure Hunt

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

Start Hunting!