Пусть x=1:100 и N=1:10. Я хотел бы создать матрицу x^N, чтобы столбец i th содержал записи [1 i i^2 ... i^N].
Я легко могу сделать это с помощью циклов for. Но есть ли способ сделать это с помощью векторизованного кода?
Пусть x=1:100 и N=1:10. Я хотел бы создать матрицу x^N, чтобы столбец i th содержал записи [1 i i^2 ... i^N].
Я легко могу сделать это с помощью циклов for. Но есть ли способ сделать это с помощью векторизованного кода?
Я бы пошел на:
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]');
Надеюсь это поможет.
Похоже на матрицу Вандермонда. Поэтому используйте vander:
A = vander(1:100);
A = A(1:10, :);
i содержал степени i: A = rot90(vander(1:N));
- person gnovice; 14.10.2010
Поскольку ваши матрицы не такие большие, наиболее простой способ сделать это - использовать MESHGRID и поэлементный оператор мощности .^:
[x,N] = meshgrid(1:100,0:10);
x = x.^N;
Это создает матрицу 11 на 100, где каждый столбец i содержит [i^0; i^1; i^2; ... i^10].
clear all; V=ones(10000); V=V.'; выдает ошибку нехватки памяти. Кроме того, нет никакого смысла увеличивать число до такой большой степени. Даже просто 2^1000 приводит к 1.0715e+301, что немного меньше максимального значения для удвоений.
- person gnovice; 14.10.2010
type vander в командном окне MATLAB.
- person gnovice; 14.10.2010
Не уверен, что это действительно соответствует вашему вопросу.
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))];
1:100
- person Adrien; 13.10.2010
Почему бы не использовать простой для понимания цикл 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
Чтобы понять умные векторизованные версии этого кода, которые показали люди, нужно больше думать. Мой способ ведения дел скорее варварский, но любой, кто его прочитает, поймет это.
Я предпочитаю простой для понимания код.
(да, я мог бы выделить заранее. Не стоит понижать ясность для таких небольших случаев.)
[1:100]. Тогда у вас будет и удобочитаемость, и эффективность.
- person Adrien; 14.10.2010