summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/toolbox/toolbox_basic/affine/m_interp4.m
blob: 314f140e10316dc658e718552af20a1b2b47bf39 (plain) (blame)
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
49
function [F,mask] = m_interp4(z,s,t)
%INTERP4 2-D bilinear data interpolation.
%       ZI = INTERP4(Z,XI,YI) assumes X = 1:N and Y = 1:M, where
%       [M,N] = SIZE(Z).
%
%       Copyright (c) 1984-93 by The MathWorks, Inc.
%       Clay M. Thompson 4-26-91, revised 7-3-91, 3-22-93 by CMT.
%
%  modified to 

 
[nrows,ncols] = size(z);


if any(size(z)<[3 3]), error('Z must be at least 3-by-3.'); end
if size(s)~=size(t), error('XI and YI must be the same size.'); end

% Check for out of range values of s and set to 1
sout = find((s<1)|(s>ncols));
if length(sout)>0, s(sout) = ones(size(sout)); end

% Check for out of range values of t and set to 1
tout = find((t<1)|(t>nrows));
if length(tout)>0, t(tout) = ones(size(tout)); end

% Matrix element indexing
ndx = floor(t)+floor(s-1)*nrows;

% Compute intepolation parameters, check for boundary value.
d = find(s==ncols); 
s(:) = (s - floor(s));
if length(d)>0, s(d) = s(d)+1; ndx(d) = ndx(d)-nrows; end

% Compute intepolation parameters, check for boundary value.
d = find(t==nrows);
t(:) = (t - floor(t));
if length(d)>0, t(d) = t(d)+1; ndx(d) = ndx(d)-1; end
d = [];

% Now interpolate, reuse u and v to save memory.
F =  ( z(ndx).*(1-t) + z(ndx+1).*t ).*(1-s) + ...
     ( z(ndx+nrows).*(1-t) + z(ndx+(nrows+1)).*t ).*s;

mask = ones(size(z));

% Now set out of range values to zeros.
if length(sout)>0, F(sout) = zeros(size(sout));mask(sout)=zeros(size(sout));end
if length(tout)>0, F(tout) = zeros(size(tout));mask(tout)=zeros(size(tout));end