C
Das ganze mal mit Standardfunktionen geschrieben (ungetestet). Dann ist schon eher zu erkennen, was die Funktion eigentlich macht.
#include <algorithm>
#include <cmath>
#include <cstddef>
#include <functional>
#include <iostream>
#include <iterator>
#include <type_traits>
#include <tuple>
#include <utility>
#include <vector>
void score(const std::vector<double>& p_ivector, const std::vector<int>& y_vector, std::vector<std::vector<int>>& vec, std::vector<double>& UserScore)
{
std::vector<std::tuple<int, double, double>> p2;
p2.reserve( p_ivector.size() );
std::transform(
p_ivector.cbegin(),
p_ivector.cend(),
y_vector.cbegin(),
std::back_inserter( p2 ),
[](double p, int y)
{
return y == 0
? std::make_tuple( y, std::sqrt( p / ( 1 - p ) ), -std::sqrt( ( 1 - p ) / p ) )
: std::make_tuple( y, std::sqrt( ( 1 - p ) / p ), -std::sqrt( p / ( 1 - p ) ) );
} );
std::transform(
vec.cbegin(),
vec.cend(),
UserScore.begin(),
[&](const std::vector<int>& f)
{
return std::inner_product(
p2.cbegin(),
p2.cend(),
f.begin(),
0.0,
std::plus<double>(),
[](const std::tuple<int, double, double>& t, int v)
{
return std::get<0>( t ) == v ? std::get<1>( t ) : std::get<2>( t );
} );
} );
}