Question

Soit x=1:100 et N=1:10. Je voudrais créer une x^N de matrice de sorte que la i e colonne contient les entrées [1 i i^2 ... i^N].

Je peux facilement le faire en utilisant pour les boucles. Mais est-il un moyen de le faire en utilisant le code vectorisé?

Était-ce utile?

La solution

J'aller pour:

x = 1:100;
N = 1:10;
Solution = repmat(x,[length(N)+1 1]).^repmat(([0 N])',[1 length(x)]);

Une autre solution (probablement beaucoup plus efficace):

Solution = [ones(size(x)); cumprod(repmat(x,[length(N) 1]),1)];

Ou même:

 Solution = bsxfun(@power,x,[0 N]');

Hope this helps.

Autres conseils

Sons comme une matrice Vandermonde. Il faut donc utiliser vander:

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

Étant donné que vos matrices ne sont pas si grand, la façon la plus straight-forward de le faire serait d'utiliser meshgrid et le opérateur de puissance élément par élément .^:

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

Cela crée une matrice 11 x 100 où chaque i de colonne contient [i^0; i^1; i^2; ... i^10].

Je ne sais pas si elle correspond vraiment à votre question.

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

EDIT: Comme l'a souligné Adrien, ma première tentative n'a pas été conforme à la question OP.

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

Pourquoi ne pas utiliser un outil facile à comprendre pour la boucle?

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

Il faut plus penser à comprendre les versions intelligentes vectorisés de ce code que les gens ont montré. Le mien est plus d'une façon barbare de faire les choses, mais tout le monde va lire le comprendre.

Je préfère facile à comprendre le code.

(oui, je aurais pu pré-alloué. Il ne vaut pas la clarté réduit pour les petits cas comme celui-ci.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top