Per il primo punto il one-liner è:
- Codice:
A = abs( bsxfun( @minus, v, v' ) );
dove abs calcola il valore assoluto di tutti gli elementi della matrice passata come argomento, bsxfun è una funzione particolare che applica una operazione binaria (@minus rappresenta la sottrazione) a tutti gli elementi delle due matrici passate come secondo e terzo argomento in cui si suppone che le matrici siano state espanse lungo la direzione in cui hanno dimensione uno in modo da uguagliare le dimensioni delle due matrici. Mi rendo conto che sembra complicato, ma una volta che si comprende il suo significato è decisamente potente (ed efficiente..).
In alternativa si può anche usare repmat (che però è più lento perché crea diverse matrici intermedie):
- Codice:
A = abs( repmat(v,length(v),1) - repmat(v', 1, length(v)) );
repmat crea una matrice che contiene diverse copie della matrice passata come primo argomento (repmat(A,m,n) crea una matrice che contiene m x n copie di A). Ho supposto che v sia una matrice riga..
Infine puoi ovviamente usare dei cicli come nel codice seguente (personalmente preferisco la prima versione anche solo per il piacere di essere riuscito a scrivere tutto in una sola linea..):
- Codice:
A = zeros(length(v));
for i=1:length(v)
for j=1:length(v)
A(i, j) = abs(v(i) - v(j));
end
end
Probabilmente, se sei alle prime armi, conviene usare questa ultima versione.
Per calcolare la somma degli elementi di un qualche vettore esiste la funzione sum. Se estrai le righe e le colonne con codici tipo A(1,:) e A(:,1), allora dovresti riuscire a scrivere senza problemi il codice per la seconda parte. Per contare il numero di elementi della matrice minori di un certo numero puoi semplicemente scrivere un ciclo con un contatore all'interno. In alternativa puoi usare qualcosa come il seguente (forse è necessario un cast in Matlab - sto usando Octave):
- Codice:
count = sum( sum( A < num ) );
Ti consiglio di usare i cicli se non hai idea di quale sia il significato della riga precedente.