2017-01-07 4 views
1

У меня есть массив [2; 3] и матрица [ 1 3 4 5; 2 4 9 2]. Теперь я хотел бы извлечь второй элемент из первой строки и третьего элемента из второй строки и, таким образом, получить [3 ; 9]. Мне удалось сделать это с помощью цикла, но поскольку я работаю с гораздо большими массивами, я бы хотел их избежать.Извлечь значения из массива 2d с индексами из другого массива (без циклов)

ответ

4

Вы можете использовать sub2ind для преобразования каждого из индексов столбцов (наряду с их рядами индексов) в linear index, а затем использовать что индексировать в вашу матрицу.

A = [1 3 4 5; 2 4 9 2]; 
cols = [2; 3]; 

% Compute the linear index using sub2ind 
inds = sub2ind(size(A), (1:numel(cols)).', cols); 

B = A(inds) 
% 3 
% 9 

В качестве альтернативы, можно вычислить линейные индексы сами, который будет более производительным, чем sub2ind

B = A((cols - 1) * size(A, 1) + (1:numel(cols)).'); 
% 3 
% 9 
2

Эксплуатируя функцию diag, вы можете получить элегантное решение одной строки:

A = [1 3 4 5; 2 4 9 2]; 
cols = [2; 3]; 

B = diag(A(:,cols)) 
% 3 
% 9 

Вот что diag(A(:,cols)) делает:

  1. A(:,cols) выбирает столбцы cols из A с колонной kA(:,cols) из соответствующего столбца cols(k) из A, давая [3 4; 4 9];
  2. diag возвращает диагональные элементы этой матрицы, тем самым возвращаясь в положении kk -го диагонального элемента A(:,cols), который A(k,cols(k)).
Смежные вопросы