Выбор вектора из матрицы без использования `sub2ind` - PullRequest
1 голос
/ 09 февраля 2012

У меня есть матрица 5х5 М и два вектора

x=[1:5]
y=[1 4 3 5 2]

Я хотел бы извлечь элементы M с помощью индексов (x, y), т. Е. (1,1), (2,4), (3,3), (4,5), (5,2) , Конечно, я мог бы сделать что-то вроде

M(sub2ind([5,5],x,y))

Но есть некоторые накладные расходы, связанные с преобразованием в индексы. Есть ли другой способ сделать то же самое?

Ответы [ 4 ]

3 голосов
/ 09 февраля 2012

MATLAB использует формат Column Major, почему бы не использовать это? М 5х5 Так, Первый столбец - это М (1), М (2), М (3), М (4), М (5). Итак, обобщив это:

М (х, у) = М ((х + (у-1) * 5)

1 голос
/ 10 февраля 2012

Не ответ. Но так как мне было интересно, я запускаю собственные тесты.

M = magic(5)
x=[1:5];
y=[1 4 3 5 2];

%%
tic
for i=1:10000
    out = M(sub2ind([5,5],x,y));
end
toc % Elapsed time is 0.413526 seconds.
out
%%
tic
for i=1:10000
    out = M(x+(y-1)*5);
end
toc % Elapsed time is 0.024004 seconds.
out
%%
fun = @(x,y)(M(x,y)); 
tic
for i=1:10000
    out = arrayfun(fun,x,y);
end
toc % Elapsed time is 0.449727 seconds.
out
%%
fun = @(x,y)(M(x,y)); 
tic
for i=1:10000
    out = nan(1,5);
    for j=1:5
        out(j) = M(x(j),y(j));
    end
end
toc % Elapsed time is  0.045242 seconds.
out

(извините, в первой программе была глупая ошибка копирования-вставки)

Я не ожидал, что цикл for выйдет вторым.

Я нахожусь на 2011b - так что, похоже, он значительно улучшился.

1 голос
/ 10 февраля 2012

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

% declare an anonymous function which operates on M with args x and y
fun = @(x,y)(M(x,y)); 
% Ask arrayfun to execute "fun" for each pair of x and y.
arrayfun(fun, x, y); 
0 голосов
/ 09 февраля 2012

Я думаю, что ваш подход sub2ind является самым быстрым.

Если вы думаете о читаемости - возможно, прочитайте в цикле for

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