Index exceeds matrix dimensions
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaire
Réponses (2)
Azzi Abdelmalek
le 29 Août 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)
0 commentaires
Walter Roberson
le 29 Août 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.
0 commentaires
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!