Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: alext87Ответов: 5

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

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

  • +1 за возможность увидеть все эти разные подходы. zellus 14.10.2010

matlabmatrixvectorization

Ответы

Ответ 1 · рейтинг 11 · Adrien

Я бы пошел на:

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 · рейтинг 6 · Oliver Charlesworth

Похоже на матрицу Вандермонда. Поэтому используйте vander:

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

Ответ 3 · рейтинг 5 · gnovice

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

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

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

Ответ 4 · рейтинг 2 · zellus

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

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

РЕДАКТИРОВАТЬ: Как указал Адриан, моя первая попытка не соответствовала вопросу OP.

xn = 100;
N=10;
solution = [ones(1,xn); bsxfun(@power, cumsum(ones(N,xn),2), cumsum(ones(N,xn),1))];

Ответ 5 · рейтинг 1 · MatlabDoug

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы