Как выбрать один элемент из каждого столбца матрицы в Matlab? - PullRequest
8 голосов
/ 18 ноября 2011
a = [1 1 1; 2 2 2; 3 3 3];

b = [1 2 3];

Как я могу вызвать одну функцию, чтобы получить вектор v[i] = a[b[i],i]?

Ответы [ 2 ]

5 голосов
/ 18 ноября 2011
v = a(sub2ind(size(a), b, 1:length(b)))

sub2ind преобразует подписки в единый индекс.

0 голосов
/ 18 ноября 2011

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

Сначала определите функцию, которая отображает значение x на желаемый результат.

fn = @(x)  a(b(x), x);

Затем вызовите эту функцию для каждого входа в векторе i.

i = 1:3;
v = arrayfun(fn, i);

Или все это можно сделать в одной строке очевидным образом:

v = arrayfun(@(x)  a(b(x), x), 1:3);

Этот arrayfun является просто сокращением для следующего цикла:

for ixLoop = 1:3
    v(ixLoop) = a(b(ixLoop),ixLoop);
end

Связанные функции arrayfun, cellfun и structfun имеют аналогичное использование и странным образом расширяют возможности. Эта статья Джоэля убедила меня быть верующим.

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