Preserving the shape of the indices vector when indexing into another vector.

조회 수: 4 (최근 30일)
Federico Miretti
Federico Miretti 2020년 10월 16일
편집: Ameer Hamza 2020년 10월 22일
Suppose i have a vector of values A
A = [5 10 15 20 25];
And a vector of indeces that may have any number of singleton leading dimensions, e.g.
idx = zeros(1,1,3);
idx(:) = 1:3
idx(:,:,1) =
1
idx(:,:,2) =
2
idx(:,:,3) =
I want to get the elements of A specified by the subscripts in idx, and I want the output B to have the same dimensions as idx. In this example, what I want to get is
B(:,:,1) =
5
B(:,:,2) =
10
B(:,:,3) =
15
Instead of the default indexing behaviour which would get me:
B = A(idx)
B =
5 10 15
I know that i could obtain this by first initializing B to have the same size of idx, i.e.
B = zeros(size(idx));
B(:) = A(idx);
However, in my application, I am developing a toolbox that must be able to work with user-created functions. I can act on idx, which will be fed as an input to the user-created function, but the rest is up to the user and I cannot expect him to write these two lines of code.
Is there any way to achieve this?
  댓글 수: 4
Bruno Luong
Bruno Luong 2020년 10월 16일
Yeah but not a word about "generalized" vector as with Federico's example. And documented on a blog is kind of light evidence.
Federico Miretti
Federico Miretti 2020년 10월 21일
Thank you all for your comments.
@Stephen Colbeck: I understand that that's the default behaviour for indexing vectors with vectors. My problem is, I need the exact opposite: I need the number of elements of C to be the number of elements in B with the orientation of B.
I know this may not be possible at all, but I still thought it was worth trying here on Answers.

댓글을 달려면 로그인하십시오.

답변 (1개)

Ameer Hamza
Ameer Hamza 2020년 10월 16일
편집: Ameer Hamza 2020년 10월 16일
This can be one of the way
B = reshape(A(idx), size(idx));
Although, I wonder is why MATLAB does not follow normal behavior for indexing A(idx). Maybe there is a good reason, or maybe this is an oversight.
  댓글 수: 4
Federico Miretti
Federico Miretti 2020년 10월 22일
편집: Federico Miretti 2020년 10월 22일
I cannot act on A, as A might be any vector defined by the user. The only thing I can act on is idx... Can I achieve what you are suggesting by defining a subclass fo idx? I saw on the documentation that there is a method called subsindex which seems relevant.
Do you think it could make sense to define a subclass for idx and overload subsindex? (I have no experience with overloading methods so I'm not really sure what I am talking about).
Ameer Hamza
Ameer Hamza 2020년 10월 22일
편집: Ameer Hamza 2020년 10월 22일
I don't think that overloading subsindex will help here. subsindex only returns the indexes, but as we already saw, the shape of indexes have no effect on the output of indexing when idx is 1x1x3.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by