Векторизация создания матрицы последовательных полномочий - PullRequest
12 голосов
/ 13 октября 2010

Пусть x=1:100 и N=1:10.Я хотел бы создать матрицу x^N, чтобы столбец i th содержал записи [1 i i^2 ... i^N].

. Я легко могу сделать это, используя циклы for.Но есть ли способ сделать это с помощью векторизованного кода?

Ответы [ 5 ]

11 голосов
/ 13 октября 2010

Я бы пошел на:

x = 1:100;
N = 1:10;
Solution = repmat(x,[length(N)+1 1]).^repmat(([0 N])',[1 length(x)]);

Другое решение (возможно, гораздо более эффективное):

Solution = [ones(size(x)); cumprod(repmat(x,[length(N) 1]),1)];

Или даже:

 Solution = bsxfun(@power,x,[0 N]');

Надеюсь, это поможет.

6 голосов
/ 13 октября 2010

Звучит как матрица Вандермонда.Так что используйте Вандер :

A = vander(1:100);
A = A(1:10, :);
5 голосов
/ 13 октября 2010

Поскольку ваши матрицы не такие большие, самый простой способ сделать это - использовать MESHGRID и поэлементный оператор мощности .^:

[x,N] = meshgrid(1:100,0:10);
x = x.^N;

Это создает матрицу 11 на 100, где каждый столбец i содержит [i^0; i^1; i^2; ... i^10].

2 голосов
/ 13 октября 2010

Не уверен, что это действительно соответствует вашему вопросу.

bsxfun(@power, cumsum(ones(100,10),2), cumsum(ones(100,10),1))

EDIT: Как указал Адриен, моя первая попытка не соответствовала вопросу ОП.

xn = 100;
N=10;
solution = [ones(1,xn); bsxfun(@power, cumsum(ones(N,xn),2), cumsum(ones(N,xn),1))];
1 голос
/ 13 октября 2010

Почему бы не использовать простой для понимания цикл?

c = [1:10]'; %count to 100 for full scale problem
for i = 1:4; %loop to 10 for full scale problem
    M(:,i) = c.^(i-1)
end

Требуется больше размышлений, чтобы понять умные векторизованные версии этого кода, которые показали люди. Мой - скорее варварский способ ведения дел, но любой, кто его прочитает, поймет это.

Я предпочитаю простой для понимания код.

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

...