অক্টাভা: ভেক্টরের দুটি ম্যাট্রিকের মধ্যে দূরত্ব গণনা করুন


12

ধরুন আমার কাছে যথাক্রমে দুটি, এনএক্স 2, এমএক্স 2, এন, এম 2 ডি ভেক্টর উপস্থাপন রয়েছে mat প্রতিটি ভেক্টর জোড়ার (এন, মি) মধ্যে দূরত্ব গণনা করার জন্য কি সহজ এবং ভাল উপায় আছে?

সহজ তবে অদক্ষ উপায় অবশ্যই:

d = zeros(N, M);
for i = 1:N,
  for j = 1:M,
    d(i,j) = norm(n(i,:) - m(j,:));
  endfor;
endfor;

আমার নিকটতম উত্তরটি পাওয়া গেছে bsxfun, এর মতো ব্যবহার করা হয়:

bsxfun(inline("x-y"),[1,2,3,4],[3;4;5;6])

ans =
  -2 -1  0  1
  -3 -2 -1  0
  -4 -3 -2 -1
  -5 -4 -3 -2

আমি এটি একবার দেখেছি এবং আমি গণনা ভেক্টরাইজিংয়ের চেয়ে আরও ভাল কিছু করতে পারি না। আমি মনে করি বাহ্যিক সি / ফোর্টরান ফাংশন লেখার জন্য এই গণনাটি বেশ ভাল প্রার্থী।
আরন আহমদিয়া

1
আমি বাজি ধরছি যে আপনি একটি 2xNxM ম্যাট্রিক্স তৈরি করতে পারেন যা আপনি বাহ্যিক পণ্য দ্বারা পপুলেশন করেন, তারপরে প্রতিটি এন্ট্রিগুলিকে বর্গক্ষেত্র করুন এবং জিরোথ অক্ষ এবং বর্গমূলের বরাবর যোগ করুন। পাইথনে এটির মতো দেখতে হবে: দূরত্ব_ম্যাট্রিক্স = (এন [:,:, নেক্স্যাক্সিস] * মি [:, নিউএক্সিস ,:]); দূরত্ব_ম্যাট্রিক্স = দূরত্ব_ম্যাট্রিক্স ** 2; দূরত্ব_ম্যাট্রিক্স = স্কয়ার্ট (দূরত্ব_ম্যাট্রিক্স.সুম (অক্ষ = 1)); আপনার যদি কেবল নিকটস্থ এন-ভেক্টরদের জানতে হবে তবে এটি করার আরও অনেক ভাল উপায় আছে!
meawoppl

3
@ মাওওপিপিএল (নতুন থেকে অ্যাকটাভ) আমি জানতে পারি কীভাবে অষ্টাভে লিনিয়ার-বীজগণিত প্যাকেজটি ব্যবহার করতে হয় , যা সরবরাহ করে cartprod, তাই এখন আমি লিখতে পারি: (1) x = cartprod(n(:,1), m(:,1)); (2) y = cartprod(n(:,2), m(:,2)); (3) .. যা d = sqrt((x(:,1)-x(:,2)).^2+(y(:,1)-y(:,2)).^2) আরও দ্রুত চালায়!
কেলি ভ্যান এভার্ট

উত্তর:


6

ভেক্টরাইজিং এই জাতীয় কৌশল ব্যবহার করে এই পরিস্থিতিতে সোজা ward

eN = ones(N,1);
eM = ones(M,1);
d  = sqrt(eM*n.^2' - 2*m*n' + m.^2*eN');

এখানে একটি উদাহরণ যা এম = 1000 এবং এন = 2000 এর জন্য 15 এক্স স্পিডআপের সাথে লুপকে ভেক্টরাইজ করে।

n = rand(N,2);
m = rand(M,2);
eN = ones(N,2);
eM = ones(2,M);

tic;
d_vect  = sqrt(eN*m.^2' - 2*n*m' + n.^2*eM);
vect_time = toc;

tic;
for i=1:N
  for j=1:M
     d_for(i,j) = norm(n(i,:)-m(j,:));
  end
end
for_time = toc; 

assert(norm(d_vect-d_for) < 1e-10*norm(d_for)) 

ডেভিড, তোমাকে স্কিকম্পে দেখে ভাল লাগল! আমি নির্লজ্জভাবে আপনার কোড টুকরাটি সম্পাদনা করেছি এবং এটি কিছুটা প্রসারিত করেছি, দয়া করে আমার সম্পাদনাগুলি আপনার উদ্দেশ্য কী তা স্পষ্ট করে ভুল পথে চলে গেছে তা ফিরিয়ে দিন।
অরন আহমদিয়া

2

অক্টাভা ৩.৪.৩ এবং পরের অপারেটর থেকে - স্বয়ংক্রিয় সম্প্রচার করে (অভ্যন্তরীণভাবে বিএসএক্সফান ব্যবহার করে)। সুতরাং আপনি এই পথে এগিয়ে যেতে পারেন।

Dx = N(:,1) - M(:,1)';
Dy = N(:,2) - M(:,2)';
D = sqrt (Dx.^2 + Dy.^2);

আপনি 3 ডি ম্যাট্রিক্স ব্যবহার করে একই কাজ করতে পারেন তবে আমার ধারণা এটি আরও পরিষ্কার is ডি দূরত্বের একটি এনএক্সএম ম্যাট্রিক্স, এম এর প্রতিটি ভেক্টরের বিপরীতে এন এর প্রতিটি ভেক্টর against

আশাকরি এটা সাহায্য করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.