Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Differenze medie

43 views
Skip to first unread message

Bruno Campanini

unread,
Feb 17, 2024, 1:47:30 PMFeb 17
to
A1:A4 B1:B4
Redditi Redditieri
15 15
22 12
38 23
55 65
------
115
Con 115 redditieri si formano Combin(115,2) = 6555 coppie,
quindi 6555 differenze di reddito, molte delle quali duplicate,
delle quali si vuole determinare la media aritmetica.

Il calcolo è il seguente: (gli spazi fra numeri valgono * )
d1 := Abs[15 - 22] 15 12 + Abs[15 - 38] 15 23 + Abs[15 - 55] 15 65
d2 := Abs[22 - 38] 12 23 + Abs[22 - 55] 12 65
d3 := Abs[38 - 55] 23 65

d1 + d2 + d3
-------------- = 15.83
6555

In Mathematica v13, una frazione con una decina di elementi,
in Excel VBA, 8 righe di codice.
Per gli amanti del "funzionalismo"?

Bruno

issdr

unread,
Feb 18, 2024, 11:36:55 PMFeb 18
to
=LET(d;
LAMBDA(i;
SOMMA(ASS(SCARTO(A1:A3;i;;3)-A1:A3)*SCARTO(B1:B3;i;;3)*B1:B3));
(d(1)+d(2)+d(3))/COMBINAZIONE(SOMMA(B1:B4);2))

quasi sicuramente si può far meglio. questa potrebbe venire
parametrizzata circa il range, contandone le righe e togliendone una per
ottenere il numero da utilizzare nelle SCARTO.

casanmaner

unread,
Feb 19, 2024, 8:45:49 AMFeb 19
to
I due "scarti" potrebbero partire, rispettivamente, da A1 e B1.
Comunque la matrice di valori non cambierebbe. Vengono sempre presi i
primi tre valori a partire da A2 e B2.
Putroppo non si crea una matrice di "scarti" impostando "A1:A3".


Il problema maggiore, e a mio parere non risolvibile, è rendere dinamico
il numero di "addendi" d(1)+d(2)+d(3).
Se ad es. vi fosse una ulteriore riga di valori occorrerebbe inserire
manualmente un d(4).

Ho fatto delle prove senza LET e LAMBDA ma senza colonne di appoggio non
ho trovato soluzioni.


casanmaner

unread,
Feb 19, 2024, 9:33:04 AMFeb 19
to
Ah, mi sono dimenticato la soluzione con la colonna d'appoggio:

=SOMMA(ASS(SCARTO($A$1;RIGHE($A$1:A1)-1;0;1)-SCARTO($A$1;RIGHE($A$1:A1);0;RIGHE($A$1:$A$4)-RIGHE($A$1:A1)))*SCARTO($B$1;RIGHE($A$1:A1)-1;0;1)*SCARTO($B$1;RIGHE($A$1:A1);0;RIGHE($A$1:$A$4)-RIGHE($A$1:A1)))

da trascinare in basse, in questo caso, per tre righe.

Poi in una cella la somma di quella colonna diviso la combinazione della
somma dei valori della colonna B.

Nel caso vi fossero ulteriori righe di dati andrebbe aggiornato il range
$A$1:$A$4

Volendo si potrebbe rendere dinamico questo intervallo a sua volta con
un conta.valori e scarto.

casanmaner

unread,
Feb 19, 2024, 9:40:46 AMFeb 19
to
Il 19/02/2024 15:33, casanmaner ha scritto:

>
> Volendo si potrebbe rendere dinamico questo intervallo a sua volta con
> un conta.valori e scarto.

Ad es. così:

=SOMMA(ASS(SCARTO($A$1;CONTA.VALORI($A$1:A1)-1;0;1)-SCARTO($A$1;CONTA.VALORI($A$1:A1);0;CONTA.VALORI($A:$A)-CONTA.VALORI($A$1:A1)))*SCARTO($B$1;CONTA.VALORI($A$1:A1)-1;0;1)*SCARTO($B$1;CONTA.VALORI($A$1:A1);0;CONTA.VALORI($A:$A)-CONTA.VALORI($A$1:A1)))

Se si volesse trascinare la formula per un numero maggiore di righe da
anteporre SE.ERRORE a cui associare lo zero come risultato in caso di
errore.

issdr

unread,
Feb 19, 2024, 9:55:24 AMFeb 19
to
casanmaner wrote:

> I due "scarti" potrebbero partire, rispettivamente, da A1 e B1.
> Comunque la matrice di valori non cambierebbe. Vengono sempre presi i
> primi tre valori a partire da A2 e B2.
> Putroppo non si crea una matrice di "scarti" impostando "A1:A3".

è una colonna, non ho trovato modo di aumentare le dimensioni in modo
pratico.

non so se hai notato che la finestra fissa che faccio scorrere necessita
di spazio libero sotto il range. ho in testa una versione dinamica
utilizzando INDIRETTO, ma ho perso la pazienza di spippolare su Excel
mobile, la proverò su computer.

> Il problema maggiore, e a mio parere non risolvibile, è rendere
> dinamico il numero di "addendi" d(1)+d(2)+d(3).
> Se ad es. vi fosse una ulteriore riga di valori occorrerebbe inserire
> manualmente un d(4).

anche qui ho qualche idea. rispetto a Mathematica siamo già avanti così
in ogni caso 😉

> Ho fatto delle prove senza LET e LAMBDA ma senza colonne di appoggio
> non ho trovato soluzioni.

le hai, usale...

issdr

unread,
Feb 19, 2024, 9:58:43 AMFeb 19
to
casanmaner wrote:

> Se si volesse trascinare la formula per un numero maggiore di righe da
> anteporre SE.ERRORE a cui associare lo zero come risultato in caso di
> errore.

simile alla ma più precisa della mia di partenza, forse potresti
semplificarla, evitando di trascinare, con LET.

casanmaner

unread,
Feb 19, 2024, 10:25:32 AMFeb 19
to
Il 19/02/2024 15:55, issdr ha scritto:
> casanmaner wrote:
>

>
>> Ho fatto delle prove senza LET e LAMBDA ma senza colonne di appoggio
>> non ho trovato soluzioni.
>
> le hai, usale...

Stavo lavorando su Excel 2013 :)

issdr

unread,
Feb 21, 2024, 9:35:19 AMFeb 21
to
issdr wrote:

> casanmaner wrote:
>
>> I due "scarti" potrebbero partire, rispettivamente, da A1 e B1.
>> Comunque la matrice di valori non cambierebbe. Vengono sempre presi i
>> primi tre valori a partire da A2 e B2.
>> Putroppo non si crea una matrice di "scarti" impostando "A1:A3".
>
> è una colonna, non ho trovato modo di aumentare le dimensioni in modo
> pratico.
>
> non so se hai notato che la finestra fissa che faccio scorrere necessita
> di spazio libero sotto il range. ho in testa una versione dinamica
> utilizzando INDIRETTO, ma ho perso la pazienza di spippolare su Excel
> mobile, la proverò su computer.

eccola:

=LET(d;
LAMBDA(i;
SOMMA(ASS(INDIRETTO("A"&i+1&":A4")-INDIRETTO("A"&i))*
INDIRETTO("B"&i+1&":B4")*INDIRETTO("B"&i)));
(d(1)+d(2)+d(3))/COMBINAZIONE(SOMMA(B1:B4);2))

issdr

unread,
Feb 22, 2024, 6:45:43 AMFeb 22
to
casanmaner wrote:

> Il problema maggiore, e a mio parere non risolvibile, è rendere
> dinamico il numero di "addendi" d(1)+d(2)+d(3).
> Se ad es. vi fosse una ulteriore riga di valori occorrerebbe inserire
> manualmente un d(4).

sto studiando le nuove funzioni "vettoriali", un mondo nuovo, purtroppo
documentato poco e in certi casi male. in attesa che i concetti
sedimentino e (spero) quaglino, metto qua una nota sui thunk: a LAMBDA
non si possono passare array, ma esiste un modo per aggirare la
limitazione, esempio:

=LAMBDA(i;LAMBDA(i^2))(SEQUENZA(5))()

questo è un thunk. la funzione delle parentesi vuote è ripescare la
LAMBDA nidificata senza parametro.

ovviamente non utilizzabile nel caso in oggetto, almeno con gli approcci
nelle due soluzioni funzionanti comparse qui, perchè sia SCARTO che
INDIRETTO non accettano vettori dove servirebbe averli.

casanmaner

unread,
Feb 22, 2024, 8:22:23 AMFeb 22
to
Il giorno giovedì 22 febbraio 2024 alle 12:45:43 UTC+1 issdr ha scritto:

>
> =LAMBDA(i;LAMBDA(i^2))(SEQUENZA(5))()
>

In pratica "SEQUENZA(5)" è il valore (in questo caso una matrice di valori) passato all'argomento "i" definito per la prima LAMBDA.
La seconda LAMBDA non ha argomenti propri ma per farla calcolare, nella cella, occorre inserire le parentesi ulteriori.
Interessante perché in pratica applica ad ogni valore di una matrice una funzione (in questo caso la potenza al quadrato).
Ho notato che le stesse vanno inserite anche se la lamba viene inserita in un nome. Diversamente viene restituito "calc".

issdr

unread,
Feb 22, 2024, 9:10:48 AMFeb 22
to
corretto, ho riportato un esempio semplice.

in una LET ad esempio, si ha una buona leggibilità impostando un nome
"thunk" generico come LAMBDA(x;LAMBDA(x)) ed utilizzando il riferimento
per definire il calcolo.
0 new messages