The Math Forum

Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Math Forum » Discussions » Software » comp.soft-sys.matlab

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: Extracting particular row of a matrix based on specific condition
Replies: 14   Last Post: Jan 3, 2014 10:03 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]

Posts: 9,850
Registered: 6/7/07
Re: Extracting particular row of a matrix based on specific condition
Posted: Jan 2, 2014 2:02 PM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

On 1/2/2014 12:00 PM, Bruno Luong wrote:
> dpb <> wrote in message <la3v66$3rm$>...

>> Been puzzling over your last comment, Bruno...couldn't decide what you
>> meant by "recomputing it". I guess you're speaking of the logical test
>> to select nonzero elements instead of just a direct use of the logical
>> addressing vector.

> Yes, (ib > 0) is identical as t, wht throw it away with "~" ?

Because they're _not_ the same...OP wants the order in the order found
in A whereas the logical array directly returns the order in B. See the
difference for the example case...

>> A = [519 520 521 1000];
>> B = [1000 0.12 0.005 0.1

520 0.13 0.001 0.89
518 0.12 0.002 0.98
600 0.14 0.004 0.90];
>> B(ismember(B(:,1),A),2:end)
ans =
0.1200 0.0050 0.1000
0.1300 0.0010 0.8900

Returns the first two rows of B which are the 1st and 2nd entries in A,
in order. So the logical array has the first two values T, rest F and
those two are the ones returned by matching position.


>> [~,ib]=ismember(A,B(:,1));
>> B(ib(ib>0),2:end)

ans =
0.1300 0.0010 0.8900
0.1200 0.0050 0.1000

Returns the same two rows but in obverse order (namely the order in
which the locations are found in A as requested). The difference is
that ib returns the absolute value of the row in B where the
corresponding value from A was found and so is [2 1 0 0] numeric instead
of [1 1 0 0] logical. Since it isn't a logical array the need to use
the logical test to only return the nonzero elements but do need to use
them as indices, not logicals.

>> The problem I see with sort() is that I think in the general case the
>> results could be jumbled since the two matrices are given
>> independently. AFAICT there's no guarantee the magnitude order would
>> be the same as the position order in the B array of an arbitrary
>> selection of values in the A vector. Or, at least, that's my
>> understanding of the OP's quest...

> I don't understand. In my command, sort(ib(t)) returns the indexes in
> ascending order. Nothing to do with "magnitude".

You're right there; it's on the ib vector instead of B; my bad there...

It accomplishes same thing as above does but the other does it w/o need
for an additional sort() operation...


Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© The Math Forum at NCTM 1994-2018. All Rights Reserved.