Soru sorIDW interpolation
hlltrk tarafından 6 yıl önce soruldu

IDW yöntemini yapmaya çalışıyorum ama denediğim bütün kodlarda hata var. Hatanın kaynağını anlayamıyorum. mathworks.com da çalışan IDW kodu göremedim henüz.
hata :
Error in IDW (line 2)
Vint=zeros(length(y),length(x));
KOD:

function[Vint]=IDW(xc,yc,vc,x,y,e,r1,r2)
Vint=zeros(length(y),length(x));
xc=reshape(xc,1,length(xc));
yc=reshape(yc,1,length(yc));
vc=reshape(vc,1,length(vc));
if strcmp(r1,'fr')
if (r2<=0)
disp('Error: Radius must be positive')
return
end
for i=1:length(x)
for j=1:length(y)
D=[];
V=[]
wV =[];
vcc=[];
D= sqrt((x(i)-xc).^2 +(y(j)-yc).^2);
if min(D)==0
disp('Error: One or more stations have the coordinates of an interpolation point')
return
end
vcc=vc(D<r2); D=D(D<r2);
V = vcc.*(D.^e);
wV = D.^e;
if isempty(D)
V=NaN;
else
V=sum(V)/sum(wV);
end
Vint(j,i)=V;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
else
if (r2 > length(vc)) || (r2<1)
disp('Error: Number of neighbours not congruent with data')
return
end
for i=1:length(x)
for j=1:length(y)
D=[]; V=[]; wV =[];vcc=[];
D= sqrt((x(i)-xc).^2 +(y(j)-yc).^2);
if min(D)==0
disp('Error: One or more stations have the coordinates of an interpolation point')
return
end
[D,I]=sort(D);
vcc=vc(I);
V = vcc(1:r2).*(D(1:r2).^e);
wV = D(1:r2).^e;
V=sum(V)/sum(wV);
Vint(j,i)=V;
end
end
end
return
4 Cevap
En iyi cevap
sayginer Yönetici tarafından 6 yıl önce cevaplandı

Merhaba,
IDW nedir? Türkçe açıklar mısınız lütfen?
Aldığınız hatadan anladığım kadarı ile  -tahminimce- bir MATLAB fonksiyonunu sanki bir betikmiş (script) gibi F5/Run butonu ile çağırmaya çalışıyorsunuz. Bu yanlış bir kullanım.
Doğrusu: Komut Penceresine (Command Window) aşağıdaki gibi yazarak fonksiyonu çağırmaktır.

IDW(xc,yc,vc,x,y,e,r1,r2)

Tabi buradaki xc,yc,vc,x,y,e,r1 ve r2 değerlerini probleminize uygun bir şekilde girmeniz gerekiyor.

hlltrk tarafından 6 yıl önce cevaplandı

IDW (inverse distance weight) bir enterpolasyon yöntemi. Değeri bilinen noktalardan değeri bilinmeyen noktaları tahmin etmek için uzaklığı hesaplamaya katar. 
buradaki r1, ve r2 ne işe yarıyor onu da pek anlamadım diğer kısımları anladım. Matlab bilgim bayagı az fonksiyonu cagıracak sekilde yazdüm dediğiniz gibi hata almadım çalıştı ama sonuç 0 çıktı cünkü uygun veriler girmedim sanırım.

sayginer Yönetici tarafından 6 yıl önce cevaplandı

Sanırım bu sayfada paylaşılan koddan yararlanıyorsunuz: https://mathworks.com/matlabcentral/fileexchange/24477-inverse-distance-weight?focused=5220606&tab=function
Açıklama kısmında her bir değişkenin ne anlama geldiğinden kısaca bahsedilmiş:

%%% INPUTS
%xc = stations x coordinates (columns) [vector]
%yc = stations y coordinates (rows) [vector]
%vc = variable values on the point [xc yc]
%x = interpolation points  x coordinates [vector]
%y = interpolation points y coordinates [vector]
%e = distance weight
%r1 --- 'fr' = fixed radius ;  'ng' = neighbours
%r2 --- radius lenght if r1 == 'fr' / number of neighbours if  r1 =='ng'
%%% OUTPUTS
%Vint --- Matrix [length(y),length(x)] with interpolated  variable values
%%% EXAMPLES
%%% --> V_spa=IDW(x1,y1,v1,x,y,-2,'ng',length(x1));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Çok emin olmamakla birlikte anladığım kadarı ile belirli bir alan içerisindeki noktalar için interpolasyon yapıyorsunuz. Buradaki r1 değerleri de bunu belirtiyor tahminimce. Tavsiyem, IDW teorisini iyice anladıktan sonra bu kodu çalıştırmak daha kolay olacaktır.

hlltrk tarafından 6 yıl önce cevaplandı

Teşekkürler. Evet kaynak burası aslında IDW yi anladım manuel yapıyorum ama kodu anlayamadım :) Ama suan en azından bişeyler çalışıyor.