简体   繁体   中英

Why is my logical mask not working on a 2D matrix in matlab properly?

X(100,371) 
%% contains 100 datapoints for 371 variables

I want to keep only the data which are within mean+standard deviation:mean-standard deviation.

This is how I am proceeding:

mx=mean(X);sx=std(X);      
%%generate mean, std 
%%this generates mx(1,371) and sx(1,371)

mx=double(repmat(mx,100,1));
%%this fills a matrix with the same datapoints, 
%%100 times
sx=double(repmat(sx,100,1));
%% this gives mx(100,371) and sx(100,371)


g=X>mx-sx & X<mx+sx;        
%%this creates a logical mask g(100,371)
%%filled with 1s and 0s 

test(g)=X(g);               
%%this should give me test(100,371), but I get 
%%test(37100), which is wrong as it doesnt maintain 
%%the shape of X

test=reshape(test,100,371)  
%% but when I compare this to the my original matrix
%% X(100,371) I hardly see a difference (datapoints 
%% in test are still outside the range I want.

What am I doing wrong?

There is just a little bit of syntax issue with the line

test(g) = X(g);

When the compiler executes X(g) it returns all the elements in X for which g indicates 1, and at the assignment when it executes test(g) it creates a test variable good enough in size to be indexed by g which is 1x37100 and then assigns all the elements at the right places. Long story short before the assignment you can add something like:

test = zeros(size(X));

While we are at this, you could use bsxfun to get the logical indexing without having to do repmat

g = bsxfun(@gt,X,mx - sx) & bsxfun(@lt,X,mx + sx)

In R2016b or recent there is implicit bsxfun expansion

g = X > mx - sx & X < mx + sx

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM