2014-09-10 2 views
1

Я хочу, чтобы создать матрицу следующего видаСоздание матрицы с петлей в Matlab

Y = [1 x x.^2 x.^3 x.^4 x.^5 ... x.^100] 

Пусть х вектор-столбец. или даже несколько больше вариантов, таких как

Y = [1 x1 x2 x3 (x1).^2 (x2).^2 (x3).^2 (x1.x2) (x2.x3) (x3.x1)] 

Пусть x1, x2 и x3 быть векторами-столбцами Рассмотрим первый. Я пытался использовать что-то вроде

Y = [1 : x : x.^100] 

Но это тоже не работает, потому что это значит взять Y = [1 х 2 * х 3. * х ... х.^100]? (т.е. все значения от 1 до x.^100 с разностью x) Таким образом, это также не может быть использовано для создания такой матрицы. Учитывайте x = [1; 2; 3; 4]; и предложить способ, чтобы генерировать эту матрицу

Y = [1 1 1 1 1; 
     1 2 4 8 16; 
     1 3 9 27 81; 
     1 4 16 64 256]; 

без ручного написания

Y = [ones(size(x,1)) x x.^2 x.^3 x.^4] 
+0

Вы ищете изменения матрицы Вандермонда. См. '' Doc vander'' за идею, как это сделать. – Nras

+1

Кажется, у вас уже есть ответ с bsxfun. Чтобы понять, почему ваша попытка не сработала, я покажу вам, как получить силу скаляра. Это можно сделать так: '5.^[1 2 3]' (Против вашего '[1: 5: 5^3]', который просто идет от 1 до 125 с шагом 5). Решение «bsxfun» ниже в основном расширяет мой пример. –

ответ

5

Используйте эту технику - bsxfun

N = 5; %// Number of columns needed in output 
x = [1; 2; 3; 4]; %// or [1:4]' 
Y = bsxfun(@power,x,[0:N-1]) 

Выход -

Y = 
    1  1  1  1  1 
    1  2  4  8 16 
    1  3  9 27 81 
    1  4 16 64 256 

Если у вас есть x = [1 2; 3 4; 5 6] и вы хотите Y = [1 1 1 2 4; 1 3 9 4 16; 1 5 25 6 36] т.е. Y = [ 1 x1 x1.^2 x2 x2.^2 ] векторов столбцов x1, x2 ..., вы можете использовать этот Однострочник -

[ones(size(x,1),1) reshape(bsxfun(@power,permute(x,[1 3 2]),1:2),size(x,1),[])] 
+0

Предположим, что у меня есть x = [1 2; 3 4; 5 6], и я хочу Y = [1 1 1 2 4; 1 3 9 4 16; 1 5 25 6 36], т. Е. Y = [1 x1 x1.^2 x2 x2.^2] для векторов столбцов x1, x2 .. Как его изменить? – ronilp

+1

@ronilp Попробуйте это: '[ones (size (x, 1), 1) reshape (bsxfun (@ power, permute (x, [1 3 2]), 1: 2), size (x, 1), [ ])] '. Проверьте также изменения. – Divakar

+0

не могли бы вы объяснить, как работает bsxfun (@power, x, 1: 2)? – ronilp

2

Использование адаптированной версии коды найдены в Matlabs Вандер() - функция (который также можно найти в polyfit-функции), можно получить значительное ускорение по сравнению с Divakars хороший и короткое решение, если вы используете что-то вроде этого:

N = 5; 
x = [1:4]'; 
V(:,n+1) = ones(length(x),1); 
for j = n:-1:1 
    V(:,j) = x.*V(:,j+1); 
end 
V = V(:,end:-1:1); 

Это примерно в два раза быстрее для приведенного примера, и он получает примерно в 20 раз быстрее, если я установил N=50 и x = [1:40]'. Хотя я заявляю, что нелегко сравнивать время, как вариант, если скорость является проблемой, вы можете взглянуть на это решение.

+1

Эта версия работает быстрее, но повторное умножение может привести к ошибкам точности. – Daniel

+0

@ Даниэль хорошая точка. Из моего понимания, это не должно иметь значения для целых чисел. Но я этого не знаю. Я был бы рад прояснить это. – Nras

+1

Вы используете двойные значения, существует прецизионная ошибка умножения целых чисел, когда числа становятся больше, чем '2^53-1' – Daniel

1

в октаве, радиовещание позволяет писать

N=5; 
x = [1; 2; 3; 4]; 
y = x.^(0:N-1) 

выход -

y = 

    1  1  1  1  1 
    1  2  4  8 16 
    1  3  9 27 81 
    1  4 16 64 256