2015-06-03 2 views
2

Как эффективно векторизовать следующий код MATLAB, который выполняет перестановку каждой строки матрицы R по индексам в соответствующей строке матрицы P?Перестановка отдельных строк матрицы

for i = 1:size(P,1) 
    pP(i,:) = R(i,P(i,:)); 
end 

пример:

P = [3  2  1; 
    3  1  2; 
    2  3  1; 
    2  1  3; 
    1  2  3; 
    1  3  2] 

R = [6  5  4; 
    6  4  5; 
    5  6  4; 
    5  4  6; 
    4  5  6; 
    4  6  5] 

продукции следующая матрица рк:

 4  5  6 
    5  6  4 
    6  4  5 
    4  5  6 
    4  5  6 
    4  5  6 

ответ

3

Один подход с bsxfun -

nrows = size(R,1) 
pP = R(bsxfun(@plus,[1:nrows]',(P-1)*nrows)) 

Или с ndgrid -

[m,n] = size(R) 
pP = R(sub2ind([m n],ndgrid(1:m,1:n),P)) 

Или заменить ndgrid(1:m,1:n) с repmat: repmat([1:m]',[1 n]) или meshgrid: meshgrid(1:m,1:n).'.

+0

Я предпочитаю второй способ. – GameOfThrows

+1

@GameOfThrows Спасибо! Я бы пошел с 'bsxfun' за эффективность! :) – Divakar

+1

Я тоже предпочитаю подход 'bsxfun';) –

0

Это может быть не лучший способ сделать это, но вы могли бы сделать что-то вроде:

IND1 = P(:,1) 
Q(:,1) = diag(R(:,IND)); 

и повторить для Р (:, 2), P (:, 3) аналогичным образом.

+0

это еще не векторизация ...?! – michal

0

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

cell2mat(arrayfun(@(k) R(k, P(k,:)), (1:size(P,1)).', 'uni', 0)) 
Смежные вопросы