Доступ к нескольким элементам в 3D-матрице в Matlab - PullRequest
0 голосов
/ 29 августа 2018
val(:,:,1) =

0.1068    0.7150    0.6987    0.5000
0.6538    0.9037    0.1978    0.4799
0.4942    0.8909    0.0305    0.9047
0.7791    0.3342    0.7441    0.6099


val(:,:,2) =

0.6177    0.1829    0.4899    0.5005
0.8594    0.2399    0.1679    0.4711
0.8055    0.8865    0.9787    0.0596
0.5767    0.0287    0.7127    0.6820


val(:,:,3) =

0.0424    0.8181    0.6596    0.8003
0.0714    0.8175    0.5186    0.4538
0.5216    0.7224    0.9730    0.4324
0.0967    0.1499    0.6490    0.8253

Row Col    
4   1
1   2
3   3

Привет, я хочу взять несколько точек из трехмерного массива, но я не знаю эффективных методов без использования циклов. Я пытался возиться с sub2ind, но кажется, не очень эффективно делать каждую 2d матрицу отдельно.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы можете получить желаемый результат с помощью:

x1 = [4,1,3];
x2 = [1,2,3];

x = val(x1,x2,:);

for ii = 1:size(val,3)
    res(:,:,ii) = diag(x(:,:,ii)).';
end

Выход:

res =

ans(:,:,1) =
   0.779100   0.715000   0.030500
ans(:,:,2) =
   0.57670   0.18290   0.97870
ans(:,:,3) =
   0.096700   0.818100   0.973000

Или с sub2ind и неявным расширением (matlab 2016b и новее)

x1 = [4,1,3];
x2 = [1,2,3];
len = length(x1);
ind = sub2ind(size(val),x1+zeros(len,1),x2+zeros(len,1),[1:size(val,3)].'+zeros(1,len));
res = A(ind)
%if you want to preserve the third dimension add: permute(res,[1,3,2])
%we can do that because an array in matlab has an infinite number of singleton dimension

Выход:

res =

   0.779100   0.715000   0.030500
   0.576700   0.182900   0.978700
   0.096700   0.818100   0.973000
0 голосов
/ 29 августа 2018

Если вам нужны все значения данных в третьем измерении, вы можете легко получить к ним доступ:

Rows = [4, 1, 3] Col = [1, 2 ,3]<br> val(Rows,Col,:)

Выход:

>> val([4, 1, 3],[1, 2, 3],:)<br> ans(:,:,1) =<br> 0.7791 0.3342 0.7441 0.1068 0.7150 0.6987 0.4942 0.8909 0.0305<br> ans(:,:,2) =<br> 0.5767 0.0287 0.7127 0.6177 0.1829 0.4899 0.8055 0.8865 0.9787<br> ans(:,:,3) =<br> 0.0967 0.1499 0.6490 0.0424 0.8181 0.6596 0.5216 0.7224 0.9730

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...