matrix logical indexing
1 回表示 (過去 30 日間)
古いコメントを表示
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 件のコメント
採用された回答
その他の回答 (1 件)
Teja Muppirala
2011 年 9 月 13 日
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 件のコメント
Teja Muppirala
2011 年 9 月 13 日
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
2011 年 9 月 13 日
@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.
参考
カテゴリ
Help Center および File Exchange で Resizing and Reshaping Matrices についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!