Soru sorMerkezden noktaya olan mesafe bularak fark alma
mehmetozdogan tarafından 5 yıl önce soruldu

Kesit fotografıMerhaba,
2 veri grubu ile ayrı ayrı k-means komutu kullanarak verileri sınıflandırıp orta noktalarını bularak bir kesit oluşturdum. Daha sonra ilk veri grubunun ortalamasını alarak kesitin orta noktasını buldum (o). Ancak amacım bu bulduğum orta noktadan, şekilde görülen ilk veri grubu noktası olan x'e olan mesafeyi bulup sonra x'e en yakın olan 2 .veri gurubundaki  * noktasının orta noktaya olan mesafesini bulup  birinci mesafeden ikinci mesafeyi çıkartıp yazdırmak. Bunu kesitteki her X ve ona en yakın * noktası için yaptırıp yazdırmak istiyorum. Kısacası şekilde görülen d1-d2 Mesafesini her nokta için hesaplatıp yazdırmak istiyorum. Burada kilit nokta X'e en yakın *'ı bulup bu ikisi arasında işlem yapmak. Matlabda yeni olduğum için beceremedim. Yardım edebilecek birisi olursa şimdiden teşekkürler. Mevcut kodumu ve oluşturduğum kesit fotoğrafını aşağıda bulabilirsiniz.
 
y=xlsread('king1.xlsx', 'B:B');
z=xlsread('king1.xlsx', 'C:C');
a=xlsread('king2.xlsx', 'A:A');
b=xlsread('king2.xlsx', 'B:B');
c=xlsread('king2.xlsx', 'C:C');
xyz=[x y z];
abc=[a b c];
rng(1);
[idx1,C1] = kmeans(xyz,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
[idx2,C2] = kmeans(abc,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
[dist,idx3] = pdist2(xyz, C1, 'euclidean', 'Smallest',1);
newVar = xyz(idx3 ,:);
plot3(newVar(:,1), newVar(:,2), newVar(:,3), 'bx');
hold on;
xlabel ('x – axis', 'fontsize', 12);
ylabel ('y – axis', 'fontsize', 12);
zlabel ('z – axis', 'fontsize', 12);
grid
[dist2,idx4] = pdist2(abc, C2, 'euclidean', 'Smallest',1);
newVar2 = abc(idx4 ,:);
plot3(newVar2(:,1), newVar2(:,2), newVar2(:,3), 'r*')
newVar3 = mean (newVar)
newVar4 = mean (newVar2)
newVar5 = (newVar3 + newVar4)/ 2
plot3(newVar5(:,1), newVar5(:,2), newVar5(:,3), 'go')
 
 
 

3 Cevap
hakkans Yönetici tarafından 5 yıl önce cevaplandı

Merhaba,
Aşağıda genel bir algoritma yapısı yazmaya çalışacağım. Belki yapmak istediğiniz şeyde yardımcı olabilir. Temel olarak amacımız X noktası için en yakın *'ı bulmak olduğu için bunu iki adet iç içe for döngüsü ile yapabiliriz. İlk for döngüsü X noktaları üzerinde dönerken, ikinci for döngüsü * noktalarını gezerek X'e olan mesafeleri alır. İçteki for döngüsü bitince en düşük mesafeye sahip olan nokta bulunur ve hesap yapılır.

for ii=1:length(xnoktalari)
suankinokta=xnoktalari(ii,:) %nokta koordinatlarının satırlara yazıldığını varsayıyorum
   for jj=1:length(yildiznoktalari)
      mesafedegeri(jj)=abs(suankinokta-yildiznoktalari(jj,:));
   end
   [a,b]=min(mesafedegeri); %buradaki b degeri bize yildiznoktalari vektorunda kaçıncı sıradaki noktanın yakın olduğunu verecek
   yakinyildiz=yildiznoktalari(b,:);
   %d1, d2 mesafe işlemleri burada yapılacak
end
mehmetozdogan tarafından 5 yıl önce cevaplandı

Merhaba,
Öncelikle yanıtınız için teşekkürler. Sanırım kod tam benim istediğimi karşılamıyor. Mesafe hesabını o ve x arası ve o ile * arasında yapıp farkını almam gerekiyor. Birde mutlak değer olması gerekmiyor negatif değerse onu da görmek istiyorum o yuzden abs kaldırdım ancak kodu aşağıdaki gibi kodumun sonuna eklediğimde hata veriyor. Verdiği hata;
Hata
Unable to perform assignment because the indices on the left side are not compatible with the size of
the right side.
Error in mesafe_den (line 34)
mesafedegeri(jj)=(suankinokta-n(jj,:));
Kodun mevcut halinin son kısmı
m=[newVar(:,1) newVar(:,2) newVar(:,3)];
n=[newVar2(:,1) newVar2(:,2) newVar2(:,3)];
o=[newVar5(:,1) newVar5(:,2) newVar5(:,3)];
for ii=1:length(m)
suankinokta=m(ii,:) %nokta koordinatlarının satırlara yazıldığını varsayıyorum
for jj=1:length(n)
mesafedegeri(jj)=(suankinokta-n(jj,:));
end
[d,e]=min(mesafedegeri); %buradaki e degeri bize yildiznoktalari vektorunda kaçıncı sıradaki noktanın yakın olduğunu verecek
yakinyildiz=n(e,:);
%d1, d2 mesafe işlemleri burada yapılacak
end
Teşekkürler..

hakkans Yönetici tarafından 5 yıl önce cevaplandı

abs() ifadesini kaldırdığınız zaman noktalar arasındaki mesafe x ve y bileşenlerinden oluşan iki elemanlı bir vektör oluyor. Hata veren satırda ise mesafedegeri(jj)'ye iki elemanlı bir vektör ataması yapılmaya kalkıldığı için kod hata veriyor. Mesafeyi negatif olarak da almak isteyebilirsiniz ama neticede bir elemanı olmak zorunda. Öbür türlü mesafenin x ve y bileşenleri için aynı kodu iki kere çalıştırmanız gerekecektir. Ama bu da şekilde gösterdiğiniz mesafe hesabından farklı bir hesap olacaktır.