Ok... I found a solution myself. Thought it is not an efficient program, it works.
This program uses R engine and R package "sgt" to generate skewed generalized t-distribution samples. The MATLAB program calls the R program during its progression.
As pre-requisite, install R and R packages "optimx", "numDeriv" and "sgt". Also add "Rscript.exe", which shall come with the R installation, to the system PATH.
Next, put the following files under the same directory.
generate_sgt.m
function op = generate_sgt(mu, sigma, lambda, p, q, nx, ny, seed)
%% generate_sgt Skewed generalized t-distribution pseudorandom numbers.
% op = generate_sgt(mu, sigma, lambda, p, q, nx, ny, seed) returns an
% nx-by-ny matrix containing psedorandom values drawn from the skewed
% generalized t-distribution, with mean (mu), scale parameter (sigma),
% skewness (lambda), shape parameters (p,q).
%
% R engine and r package "sgt" (v2.0) is used to generate the numbers.
%%
num_of_rand = nx*ny;
if num_of_rand > 1e6
error("The number of random variables generated each time cannot exceed 1e6.")
end
if strcmp(seed, 'default')
seed = 0;
elseif strcmp(seed, 'random')
seed = randi([1,10000]);
end
generate_sgt_parameters = [mu, sigma, lambda, p, q, num_of_rand, seed];
writematrix(generate_sgt_parameters, 'generate_sgt_parameters.csv')
!Rscript.exe ./r_generate_sgt.r
generate_sgt_data = readmatrix('generate_sgt_data.csv');
op = reshape(generate_sgt_data, [nx, ny]);
end
r_generate_sgt.r
# Read parameters
generate_sgt_parameters <- read.csv('generate_sgt_parameters.csv', header = FALSE)
sgt_mu <- generate_sgt_parameters[,1]
sgt_sigma <- generate_sgt_parameters[,2]
sgt_lambda <- generate_sgt_parameters[,3]
sgt_p <- generate_sgt_parameters[,4]
sgt_q <- generate_sgt_parameters[,5]
sgt_n <- generate_sgt_parameters[,6]
sgt_seed <- generate_sgt_parameters[,7]
# Generate pseudo random numbers
library('optimx')
library('numDeriv')
library('sgt')
set.seed(sgt_seed)
x = rsgt(n = sgt_n, mu = sgt_mu, sigma = sgt_sigma, lambda = sgt_lambda, p = sgt_p, q = sgt_q, mean.cent = TRUE, var.adj = FALSE)
# Write data
write.table(x, 'generate_sgt_data.csv', sep=",", row.names = FALSE, col.names=FALSE)
Now you can generate skewed generalized t-distribution samples by running, say,
X = generate_sgt(0, sqrt(2), 0, 100, 1e6, 1 ,10000, 'default'); % Uniform
Y = generate_sgt(0, sqrt(2), 0, 1, 1e6, 1 ,10000, 'default'); % Laplace
Z = generate_sgt(0, sqrt(2), 0, 2, 1e6, 1 ,10000, 'default'); % Gaussian