matrix logical indexing
3 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
I have a matrix A with dimensions nxm. I want to extract all values x that are between two values a and b, that is: (a<x<b). How can I do it in one step?
I know i can do it in two steps: A1 = A(A>a); A2 = A1(A1<b);
how do I combine the two logical statements?
0 Commenti
Risposta accettata
Più risposte (1)
Teja Muppirala
il 13 Set 2011
In the case of checking bounds by combining two logical statements, I think the following expression will generally be significantly faster:
B = A(abs(A-(a+b)/2) < (b-a)/2);
The only thing is, you need to make sure that the datatypes and magnitudes of numbers you are working with can be used in this expression. For example, if you are working with integers, you might get overflow/underflow in some situations, etc. For regular double precision numbers you should probably be ok.
5 Commenti
Teja Muppirala
il 13 Set 2011
It is probably version dependent. I use R2011b and I find that if I run your code for A = rand(1000), I get:
t1=3.190328
t2=2.453046
For A = rand(100), I get:
t1=0.040473
t2=0.030582
I couldn't tell you the reason why, but I do know that a lot of the elementary math functions have been getting much faster lately.
Jan
il 13 Set 2011
@Teja: The math functions are limited by the processor speed, if the data match into the processor cache. For large data the memory access should be the limiting factor. Therefore I'd expect your function to be much slower for RAND(1000).
@Fangjun: I get these timings on 2009a running in a single core environment: t1=6.282469, t2=5.247344.
Vedere anche
Categorie
Scopri di più su Logical in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!