Index exceeds matrix dimensions

1 visualización (últimos 30 días)
John
John el 29 de Ag. de 2016
Respondida: Walter Roberson el 29 de Ag. de 2016
A six dimension image/matrix:
for n6 = 1:image_size(6)
img5 = imgin(:,:,:,:,:,n6);
imgout(:,:,:,:,:,n6) = operation5(img5,xout,yout);
end
The img5 is no longer 5 dimension anymore in case one of the first 5 dimensions is "1" and the command in operation5 gives error "Index exceeds matrix dimensions" because it's NOT a 5 dimension any more.
How can keep the dimension even one dimension has size "1"?
  1 comentario
Walter Roberson
Walter Roberson el 29 de Ag. de 2016
Please post the exact error message, everything in red.

Iniciar sesión para comentar.

Respuestas (2)

Azzi Abdelmalek
Azzi Abdelmalek el 29 de Ag. de 2016
This has nothing to do with the dimension, look at this example
A=[1 1;2 2]
You can write it as you want
A(:,:,1,1,1,1)
Index exceeds matrix dimension, means your are trying to access indices that doesn't exist, like for our example
A(3,1)

Walter Roberson
Walter Roberson el 29 de Ag. de 2016
>> A = ones(1,1,1,1,3)
A(:,:,1,1,1) =
1
A(:,:,1,1,2) =
1
A(:,:,1,1,3) =
1
>> size(A)
ans =
1 1 1 1 3
>> ndims(A)
ans =
5
You can see from this that it is not correct that the array stops being 5 dimensional because one of the first 5 dimensions is 1.
What is correct is that trailing dimensions of size 1 get automatically eliminated.
>> B = ones(1,1,1,3,1)
B(:,:,1,1) =
1
B(:,:,1,2) =
1
B(:,:,1,3) =
1
>> size(B)
ans =
1 1 1 3
>> ndims(B)
ans =
4
This does not, however, mean that you cannot store into there:
>> B(1,1,1,1,3) = 0
B(:,:,1,1,1) =
1
B(:,:,1,2,1) =
1
B(:,:,1,3,1) =
1
B(:,:,1,1,2) =
0
B(:,:,1,2,2) =
0
B(:,:,1,3,2) =
0
B(:,:,1,1,3) =
0
B(:,:,1,2,3) =
0
B(:,:,1,3,3) =
0
>> size(B)
ans =
1 1 1 3 3
it gets automatically extended at need when you store into it. Of course if you try to access a part that is not there then you would have a problem
>> B(1,1,1,1,1,1,2)
Index exceeds matrix dimensions.
the problem is not in specifying 7 input dimensions for a 5 dimensional array: the problem is trying to access memory that is not there. For example, B(1,1,1,1,1,1,1) is fine
My speculation is that your operation5 is not the problem, but that in your
for n6 = 1:image_size(6)
that you defined
image_size = size(imgin)
and when imgin has a trailing dimension of 1, then size() would only automatically return a vector of length 5 instead of a vector of length 6, as size() does not output any trailing 1 beyond the second dimension. There is no way to configure MATLAB to have size() return a vector of a particular length. You could use
[image_size(1), image_size(2), image_size(3), image_size(4), image_size(5), image_size(6)] = size(imgin);
or you could use
image_size = size(imgin);
image_size(end+1:6) = 1; %extend it to length 6 if it is shorter.

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by