[MATLAB]Evitare un ciclo for
Ho una piccola function che, dati:
- -) un vettore di numeri reali $x=[x_1, ..., x_M]$ (nodi);
-) un vettore di numeri positivi $w=[w_1, ...,w_M]$ (pesi);
-) due polinomi reali $P, Q$;[/list:u:2vl9db6x]
calcola la formula
$sum_{k=1}^Mw_kP(x_k)Q(x_k)$ (prodotto scalare).
Come la posso implementare per benino in MATLAB? Io me ne sono uscito con
M=length(x); p=0; for k=1:M p=p+polyval(P, x(k))*polyval(Q, x(k))*w(k); endma è possibile evitare quel ciclo for e scrivere tutto come un'unica operazione vettoriale?
Risposte
Non ho modo di provarlo, comunque cercherei di implementarlo nel modo seguente:
sum(polyval(P,x) .* polyval(Q,x) .* w);
Ottimo! Grazie.
Eccone un'altra, più difficile (per me). Ho un vettore $x$ di $n$ elementi e devo calcolare un array contenente le differenze. Cioé
$D=[[0, x_1-x_2, ..., x_1-x_n], [x_2-x_1, 0, ..., x_2-x_n], [,,ddots,],[x_n-x_1, x_n-x_2, ..., 0]]$. Chiaramente si tratta di un array antisimmetrico. Purtroppo non riesco a pensare a niente di meglio di un doppio ciclo for; si può scrivere in forma vettoriale?
$D=[[0, x_1-x_2, ..., x_1-x_n], [x_2-x_1, 0, ..., x_2-x_n], [,,ddots,],[x_n-x_1, x_n-x_2, ..., 0]]$. Chiaramente si tratta di un array antisimmetrico. Purtroppo non riesco a pensare a niente di meglio di un doppio ciclo for; si può scrivere in forma vettoriale?
Se $x$ è un vettore riga allora potresti provare con il seguente codice:
x' * ones(1, length(x)) - ones(length(x), 1) * x;
Bellissimo.
Grazie!
