Подтвердить что ты не робот

Векторизация создания матрицы последовательных степеней

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

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

4b9b3361

Ответ 1

Я бы пошел за:

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]');

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

Ответ 2

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

A = vander(1:100);
A = A(1:10, :);

Ответ 3

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

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

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

Ответ 4

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

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))];

Ответ 5

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

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

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

Мне очень нравится понимать код.

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