51 lines
1.6 KiB
Matlab
51 lines
1.6 KiB
Matlab
function results = computeSpectralAverages(S_all, scan_reference_values)
|
|
%% computeSpectralAverages
|
|
% Compute mean and SEM of spectra grouped by scan parameter.
|
|
% Handles both 1D curves and 2D matrices.
|
|
|
|
[uniqueParams, ~, idx] = unique(scan_reference_values);
|
|
nParams = numel(uniqueParams);
|
|
nTotal = numel(S_all);
|
|
nReps = nTotal / nParams;
|
|
|
|
% Determine data dimensionality
|
|
firstData = S_all{1};
|
|
dataSize = size(firstData);
|
|
isMatrix = (numel(size(firstData)) == 2) && all(size(firstData) > 1);
|
|
|
|
curves_all = cell(1, nParams);
|
|
curves_mean = cell(1, nParams);
|
|
curves_err = cell(1, nParams);
|
|
|
|
for i = 1:nParams
|
|
if isMatrix
|
|
% --- Case: 2D matrix (e.g., power spectra) ---
|
|
data_sum = 0;
|
|
for r = 1:nReps
|
|
idx_r = (r-1)*nParams + i;
|
|
data_sum = data_sum + S_all{idx_r};
|
|
end
|
|
avg = data_sum / nReps;
|
|
curves_all{i} = []; % not used for 2D
|
|
curves_mean{i} = avg;
|
|
curves_err{i} = [];
|
|
else
|
|
% --- Case: 1D curve ---
|
|
nPoints = numel(S_all{1});
|
|
curves = zeros(nReps, nPoints);
|
|
for r = 1:nReps
|
|
idx_r = (r-1)*nParams + i;
|
|
curves(r,:) = S_all{idx_r};
|
|
end
|
|
curves_all{i} = curves;
|
|
curves_mean{i} = mean(curves,1);
|
|
curves_err{i} = std(curves,0,1)/sqrt(nReps);
|
|
end
|
|
end
|
|
|
|
results.curves_all = curves_all;
|
|
results.curves_mean = curves_mean;
|
|
results.curves_error = curves_err;
|
|
results.scan_parameters = uniqueParams;
|
|
end
|