I am writing a MATLAB code to quickly solve the following problem: Let X be a random variable distributed according to P(x), take two independent copies of X, call them X1 and X2 and find the distribution of Y = f(X1,X2) where f(,) is a known function.
To solve the above, I start with two vectors x
and p
such that p(i)
= P(x(i)
). Suppose they both contain n
elements. I can easily compute the n
-by-n
matrix y
such that y(i,j)
= f(x(i)
, x(j)
). Furthermore, I can compute the n
-by-n
matrix p_out
such that p_out(i,j) = p(i) * p(j)
. This means P(Y = y(i,j)
) = p(i,j)
.
Now, if all elements of y
are distinct we are almost done. It remains just converting the matrices to vectors and perhaps sorting them to have a nice output. Suppose we also do this by setting
y = y(:);
p_out = p_out(:);
[y, idx] = sort(y);
p_out = p_out(idx);
The problem is, however, the elements of y
are not typically unique. I, hence, have to merge the identical elements of y
as follows: if y(i) = y(j)
(remember now y
is converted to a vector) then remove y(j)
and set p(i) = p(i) + p(j)
. A dirty way of doing this is using a for loop (since y
is now sorted we only need to compare each element with its following element). However, I wonder if there exits a nicer way.
I know that unique
would remove the duplicated elements of a vector (hence if we only needed y
it would be sufficient). I also know that it returns two index vectors that somehow indicate the position of duplicated elements. However, I cannot think of any nice way to use its outputs to appropriately merge the elements of p
as well.