Linear indexing over a subset of dimensions
17 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
James Bowen
el 9 de Nov. de 2022
Linear indexing over the last two dimensions of a three dimensional array seems to work:
A = zeros([3 5 5]);
aIdx = [1 7 13 19 25];
aVal = [1 2 3 ; 4 5 6 ; 7 8 9 ; 10 11 12 ; 13 14 15].';
A(:,aIdx) = aVal;
This puts the triplets of aVal into the diagonal locations of the [5 5] part of A. That is
>> A(:,2,2)
ans =
4
5
6
I want to do the same thing but with first two dimension of an array. That is something like:
B = zeros([5 5 3]);
bIdx = [1 7 13 19 25];
bVal = [1 2 3 ; 4 5 6 ; 7 8 9 ; 10 11 12 ; 13 14 15];
B(bIdx,:) = bVal;
But this does not work. A couple of ways that do work are:
B([ bIdx bIdx + 25 bIdx + 50]) = bVal;
and
bLogIdx = false([5 5]);
bLogIdx(bIdx) = true;
B(repmat(bLogIdx, [1 1 3])) = bVal;
Both of these give
>> squeeze(B(2,2,:))
ans =
4
5
6
Is there a more clever way to accomplish this? More generally, is there a way to linear index over a subset of dimensions. That is use linear indexing in the y1,y2 dimensions of A(x1,x2,y1,y2,x3,x4)?
1 comentario
Stephen23
el 9 de Nov. de 2022
Editada: Stephen23
el 10 de Nov. de 2022
"Is there a more clever way to accomplish this?"
RESHAPE or PERMUTE
"More generally, is there a way to linear index over a subset of dimensions."
By definition trailing dimensions collapse into the last subscript index. As Loren Shure wrote: "Indexing with fewer indices than dimensions If the final dimension i<N, the right-hand dimensions collapse into the final dimension."
If you think about it, linear indexing is really just a side-effect of this. An earlier discussion on this:
Respuesta aceptada
Más respuestas (1)
Ver también
Categorías
Más información sobre Matrix Indexing 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!