2015-09-26 4 views
2

Предположим, что я построить следующий 3D массивMATLAB индексации 3D массив

n = 3; 
A = zeros(n,n,n); 
A(1:n^3) = 1:n^3; 

, который дает

>> A 

A(:,:,1) = 

1  4  7 
2  5  8 
3  6  9 

A(:,:,2) = 

10 13 16 
11 14 17 
12 15 18 

A(:,:,3) = 

19 22 25 
20 23 26 
21 24 27 

можно увидеть, как MATLAB индексы 3D-массив из приведенного выше примера. Предположим, что я хотел бы получить доступ (II = 1, JJ = 3, кк = 2) элемент этого массива, который может быть сделано

>>A(1,3,2) 

ans = 

16 

В качестве альтернативы, можно использовать следующую форму, основанную на правиле индексации Matlab было показано выше

A(ii + (jj-1)*n + (kk-1)*n^2) 

в качестве примера, для II = 1, JJ = 3, кк = 2, я получаю

>> A(1 + (3-1)*3 + (2-1)*3^2) 

ans = 

16 

Чтобы проиллюстрировать эту проблему, я определить следующий 3D meshgrid (скажем, для назначение индексации индекса s, которая не актуальна здесь):

[j1 j2 j3] = meshgrid(1:n); 

Если я не ошибаюсь, здравый смысл ожидать, что

A(j1 + (j2-1)*n +(j3-1)*n^2) 

дать мне ту же самую матрицу на основе приведенных выше рассуждений, но я получаю

>> A(j1 + (j2-1)*3 +(j3-1)*3^2) 

ans(:,:,1) = 

1  2  3 
4  5  6 
7  8  9 

ans(:,:,2) = 

10 11 12 
13 14 15 
16 17 18 

ans(:,:,3) = 

19 20 21 
22 23 24 
25 26 27 

Из этого я вижу, что если вы хотите, чтобы получить тот же 3D-массив, который вы на самом деле нужно использовать

>> A(j2 + (j1-1)*3 +(j3-1)*3^2) 

, что очень странно для меня. Я размещаю эту проблему здесь, чтобы узнать, что другие люди думают об этом.

ответ

1

В Matlab нетрадиционная вещь, порядок оси [Y, X, Z]. Y - первая ось, X - вторая. Как meshgrid возвращает [X, Y, Z] вы должны использовать:

[j2 j1 j3] = meshgrid(1:n); 

Тогда вы получите ожидаемый результат. В качестве альтернативы вы можете переключиться на ndgrid который возвращает размеры в порядке:

[j1 j2 j3] = ndgrid(1:n); 
+1

@kelesa Связанный: http://stackoverflow.com/a/22461766/2586922 –

Смежные вопросы