# Selecting values from a matrix via indices in another matrix Classic List Threaded 6 messages Open this post in threaded view
|

## Selecting values from a matrix via indices in another matrix

 Hello,I have two matrices: One 2x100 matrix A containing rows like [20 200], and one 300x300 matrix B containing a range of values from 0 to 20. Is there an easy way to extract a subset of the data contained in B as a vector by using the values in A as indices? For example, if A(1,:) says (20,20), the vector's first entry should be B(20,20).Right now I'm using a for-loop, looping through A, and writing the values I extract from B into a new vector. It works, but it's not pretty or efficient.Basically, I'd like to be able to write something like B(A), but that does not yield the correct output. Any help would be very appreciated!Fii _______________________________________________ Help-octave mailing list [hidden email] https://lists.gnu.org/mailman/listinfo/help-octave
Open this post in threaded view
|

## Re: Selecting values from a matrix via indices in another matrix

 On Tue, Sep 30, 2014 at 9:28 AM, Stefanie Hasler <[hidden email]> wrote: > Hello, > > I have two matrices: One 2x100 matrix A containing rows like [20 200], and > one 300x300 matrix B containing a range of values from 0 to 20. > > Is there an easy way to extract a subset of the data contained in B as a > vector by using the values in A as indices? For example, if A(1,:) says > (20,20), the vector's first entry should be B(20,20). > > Right now I'm using a for-loop, looping through A, and writing the values I > extract from B into a new vector. It works, but it's not pretty or > efficient. > > Basically, I'd like to be able to write something like B(A), but that does > not yield the correct output. > > Any help would be very appreciated! > > Fii > > _______________________________________________ > Help-octave mailing list > [hidden email] > https://lists.gnu.org/mailman/listinfo/help-octave> Hi Fii, First, if your first matrix is 2x100, then it has 2 rows and 100 columns, so your first row would be 100 elements long.  Did you mean that it is 100x2 or that your first column would be [20;200]? If it is 2x100, and the rows are like you say they are, then one (horribly inefficient) way is to do something like: C = diag(B(A(:,1), A(:,2)); I'm sure there is a better ways, but this could be a start. Hope this helps. James Sherman _______________________________________________ Help-octave mailing list [hidden email] https://lists.gnu.org/mailman/listinfo/help-octave
Open this post in threaded view
|

## Re: Selecting values from a matrix via indices in another matrix

 In reply to this post by Stefanie Hasler On Tue, 30 Sep 2014 15:28:23 +0200 Stefanie Hasler <[hidden email]> wrote: > Hello, > > I have two matrices: One 2x100 matrix A containing rows like [20 > 200], and one 300x300 matrix B containing a range of values from 0 to > 20. > > Is there an easy way to extract a subset of the data contained in B > as a vector by using the values in A as indices? For example, if > A(1,:) says (20,20), the vector's first entry should be B(20,20). > > Right now I'm using a for-loop, looping through A, and writing the > values I extract from B into a new vector. It works, but it's not > pretty or efficient. > > Basically, I'd like to be able to write something like B(A), but that > does not yield the correct output. > > Any help would be very appreciated! > > Fii > This should give the result that you want: B(sub2ind(size(B),A(1,:),A(2,:))) The trick is using the linear index of the matrix. Hope that helps, Thomas _______________________________________________ Help-octave mailing list [hidden email] https://lists.gnu.org/mailman/listinfo/help-octave
Open this post in threaded view
|

## Re: Selecting values from a matrix via indices in another matrix

 In reply to this post by James Sherman On Tue, Sep 30, 2014 at 6:57 PM, James Sherman Jr. wrote:On Tue, Sep 30, 2014 at 9:28 AM, Stefanie Hasler <[hidden email]> wrote: > Hello, > > I have two matrices: One 2x100 matrix A containing rows like [20 200], and > one 300x300 matrix B containing a range of values from 0 to 20. > > Is there an easy way to extract a subset of the data contained in B as a > vector by using the values in A as indices? For example, if A(1,:) says > (20,20), the vector's first entry should be B(20,20). > > Right now I'm using a for-loop, looping through A, and writing the values I > extract from B into a new vector. It works, but it's not pretty or > efficient. > > Basically, I'd like to be able to write something like B(A), but that does > not yield the correct output. > > Any help would be very appreciated! > > Fii > > _______________________________________________ > Help-octave mailing list > [hidden email] > https://lists.gnu.org/mailman/listinfo/help-octave > Hi Fii, First, if your first matrix is 2x100, then it has 2 rows and 100 columns, so your first row would be 100 elements long.  Did you mean that it is 100x2 or that your first column would be [20;200]? If it is 2x100, and the rows are like you say they are, then one (horribly inefficient) way is to do something like: C = diag(B(A(:,1), A(:,2)); I'm sure there is a better ways, but this could be a start. Hope this helps. James Sherman _______________________________________________ Help-octave mailing list [hidden email] https://lists.gnu.org/mailman/listinfo/help-octave This solution is also horrible but is easy to extend to more dimensions.1. Convert you index matrix into a cellsubs_cell = mat2cell (A, size (A,1), ones (1,size (A,2)) );2. Get the linear indeces from these subindecesidx = sub2ind (size(B),subs_cell{:});3. extract the dataC = B(idx); _______________________________________________ Help-octave mailing list [hidden email] https://lists.gnu.org/mailman/listinfo/help-octave