-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterp1_array.m
48 lines (36 loc) · 3.6 KB
/
interp1_array.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function [interpolated_array] = interp1_array(base_val_array,input_array,interp_val_array,interp_dim)
% 1-D interpolation in array with multiple interpolation values, along specified dimension
size_array = size(input_array);
dim_length = size_array(interp_dim);
prod_size_not_inc_interp_dim = prod(size_array([(1:1:(interp_dim - 1)) ((interp_dim + 1):1:length(size_array))]));
reshaped_base_val_array = reshape(permute(base_val_array,[interp_dim (1:1:(interp_dim - 1)) ((interp_dim + 1):1:length(size_array))]),[dim_length prod_size_not_inc_interp_dim]);
reshaped_input_array = reshape(permute(input_array,[interp_dim (1:1:(interp_dim - 1)) ((interp_dim + 1):1:length(size_array))]),[dim_length prod_size_not_inc_interp_dim]);
reshaped_interp_val_array = reshape(permute(interp_val_array,[interp_dim (1:1:(interp_dim - 1)) ((interp_dim + 1):1:length(size_array))]),[size(interp_val_array,interp_dim) prod_size_not_inc_interp_dim]);
max_scaling = max(max(reshaped_base_val_array));
reshaped_interpolated_array = NaN([size(reshaped_interp_val_array,1) prod_size_not_inc_interp_dim]);
for interp_val_ind = 1:size(reshaped_interp_val_array,1)
curr_interp_val_array = reshaped_interp_val_array(interp_val_ind,:);
interp_val_minus_base_val = repmat(curr_interp_val_array,[dim_length 1]) - reshaped_base_val_array;
interp_val_minus_base_val(interp_val_minus_base_val < 0) = 1e15*max_scaling;
[min_diff,nearest_before_ind] = min(interp_val_minus_base_val,[],1);
nearest_before_ind((min_diff > (1e15 - 1)*max_scaling) | (nearest_before_ind == dim_length)) = NaN;
interp_val_minus_base_val = repmat(curr_interp_val_array,[dim_length 1]) - reshaped_base_val_array;
nearest_before_ind_mask = zeros(size(interp_val_minus_base_val) - [1 0]);
nearest_before_ind_mask(abs(repmat((1:1:(dim_length - 1))',[1 prod_size_not_inc_interp_dim]) - repmat(nearest_before_ind,[(dim_length - 1) 1])) < 1e-5) = 1;
nan_mask_after = ones([(dim_length - 1) prod_size_not_inc_interp_dim]);
nan_mask_after(isnan(interp_val_minus_base_val(2:dim_length,:)) == 1) = 0;
denom_weight_calc = 1./(diff(reshaped_base_val_array,1,1));
denom_weight_calc((isnan(denom_weight_calc) == 1) | (isinf(denom_weight_calc) == 1)) = 0;
interp_val_minus_base_val(isnan(interp_val_minus_base_val) == 1) = 0;
after_weight = sum(nan_mask_after.*nearest_before_ind_mask.*interp_val_minus_base_val(1:(dim_length - 1),:).*denom_weight_calc,1)./(sum(nan_mask_after.*nearest_before_ind_mask,1));
after_weight((min_diff > (1e15 - 1)*max_scaling) | (nearest_before_ind == dim_length)) = NaN;
before_weight = 1 - after_weight;
clear *minus* nan_mask_after denom_weight_calc
nan_mask_reshaped_input = ones([dim_length prod_size_not_inc_interp_dim]);
nan_mask_reshaped_input(isnan(reshaped_input_array) == 1) = 0;
reshaped_input_array(isnan(reshaped_input_array) == 1) = 0;
curr_reshaped_interpolated_array = (before_weight.*sum(nearest_before_ind_mask.*reshaped_input_array(1:(dim_length - 1),:),1)) + (after_weight.*sum(nearest_before_ind_mask.*reshaped_input_array(2:dim_length,:),1));
curr_reshaped_interpolated_array((abs(sum(nearest_before_ind_mask.*nan_mask_reshaped_input(1:(dim_length - 1),:),1)) < (1e-5)) | (abs(sum(nearest_before_ind_mask.*nan_mask_reshaped_input(2:dim_length,:),1)) < (1e-5))) = NaN;
reshaped_interpolated_array(interp_val_ind,:) = curr_reshaped_interpolated_array;
end
interpolated_array = permute(reshape(reshaped_interpolated_array,[size(reshaped_interp_val_array,1) size_array([(1:1:(interp_dim - 1)) ((interp_dim + 1):1:length(size_array))])]),[(2:1:interp_dim) 1 ((interp_dim + 1):1:length(size_array))]);