Векторизация создания матрицы последовательных степеней
Пусть x=1:100
и N=1:10
. Я хотел бы создать матрицу x^N
, чтобы столбец i
th содержал записи [1 i i^2 ... i^N]
.
Я могу легко сделать это, используя для циклов. Но есть ли способ сделать это с помощью векторизованного кода?
Ответы
Ответ 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
Требуется больше думать, чтобы понять умные векторизованные версии этого кода, которые показали люди. Шахта - это скорее варварский способ делать что-то, но любой, кто его читает, это поймет.
Мне очень нравится понимать код.
(да, я мог бы заранее выделить. Не стоит пониженной ясности для небольших случаев, подобных этому.)