matrix logical indexing

1 回表示 (過去 30 日間)
HRmatlab
HRmatlab 2011 年 9 月 13 日
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?

採用された回答

Fangjun Jiang
Fangjun Jiang 2011 年 9 月 13 日
A1=A(A>a & A<b)
  1 件のコメント
HRmatlab
HRmatlab 2011 年 9 月 13 日
thank you!

サインインしてコメントする。

その他の回答 (1 件)

Teja Muppirala
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
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
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 ExchangeResizing and Reshaping Matrices についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by