Extract unknown number of vectors from matrix

1 visualización (últimos 30 días)
math4
math4 el 22 de Oct. de 2020
Comentada: math4 el 22 de Oct. de 2020
Hey there,
I want to use the function sub2ind on the column vectors of a matrix M, let's say of size . The function sub2ind asks for: ind = sub2ind(sz,I1,I2,...,In), i.e. I would need n vectors of size as input. If I'd know the (small) number of vectors, of course I could go for I1 = M(:,1), I2 = M(:,2), ...
The problem: it doesn't run on the matrix M directly and I don't know the number of columns n beforehand. num2cell would create separated cells with the n vectors of size , but sub2ind also does not run on cells.
I couldn't find a solution for the problem; how do I get efficiently n separate vectors from a matrix with unknown size n? Is that possible? If not, how can I solve the described problem with sub2ind?
Thanks a lot for your help!

Respuesta aceptada

Stephen23
Stephen23 el 22 de Oct. de 2020
Editada: Stephen23 el 22 de Oct. de 2020
" num2cell would create separated cells with the n vectors of size, but sub2ind also does not run on cells."
True, but you can easily use a cell array to create a comma-separated list, e.g.:
spl = num2cell(M,1);
idx = sub2ind(sz,spl{:});
"how do I get efficiently n separate vectors from a matrix with unknown size n? Is that possible?"
Yes, use num2cell to create a cell array of vectors.
"how can I solve the described problem with sub2ind?"
Use a comma-separated list generated from that cell array.
  4 comentarios
Stephen23
Stephen23 el 22 de Oct. de 2020
Editada: Stephen23 el 22 de Oct. de 2020
"No your code isn't doing the right thing"
Really? Did you even try it? It gives exactly the same output as that (badly-named) third party code you linked to. I downloaded that FEX function, renamed it to sub2idx, and compared its output aginst the (very standard MATLAB) code that I gave you in my answer. Lets have a look:
>> M = randi(9,3,5); % 3x5 random indices
>> S = 9*ones(1,5); % size
>> C = num2cell(M,1); % split
>> X = sub2ind(S,C{:})
X =
20421
8960
52607
>> Y = sub2idx(S,M.') % FEX 36458
Y =
20421 8960 52607
So far I am struggling to see why you would write that my "code isn't doing the right thing", given that it returns exactly the same values as what your linked-to FEX code does, just without any third-party functions required.
math4
math4 el 22 de Oct. de 2020
Yes, of course I tried, but just quickly and my sincere apologies - I mismatched dimensions, since I had it transposed for the other code. Thanks for your solution, that's great.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Matrices and Arrays en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by