গণিত - ম্যাপিং নম্বর


99

আমি কীভাবে সংখ্যার মানচিত্র রাখি, লাইন দিয়ে, সি এবং ডি এর মধ্যে যাওয়ার জন্য a এবং b এর মধ্যে থাকি।

এটি হল, আমি 10 থেকে 20 এর মধ্যে সংখ্যার মানচিত্র করতে 2 এবং 6 এর মধ্যে সংখ্যা চাই ... তবে আমার সাধারণীকরণের ক্ষেত্রে প্রয়োজন need

আমার মস্তিষ্ক ভাজা।


উত্তর:


213

যদি আপনার নম্বরটি A এবং B এর মধ্যে পড়ে এবং আপনি Y এবং C এবং D এর মধ্যে পড়তে চান তবে আপনি নীচের লিনিয়ার রূপান্তরটি প্রয়োগ করতে পারেন:

Y = (X-A)/(B-A) * (D-C) + C

এটি আপনাকে যা দিতে চায় তা দেওয়া উচিত, যদিও আপনার প্রশ্নটি একটি সামান্য দ্বিধান্বিত, কারণ আপনি বিপরীত দিকের ব্যবধানটি মানচিত্রও তৈরি করতে পারেন। কেবল শূন্য দ্বারা বিভাগের জন্য নজর রাখুন এবং আপনার ঠিক আছে।


17
স্পষ্টতার জন্য, আমি নতুন_মূল্য = (পুরাতন_মূল্য - পুরাতন_ নীচে) / (ওল্ড টোপ - ওল্ডবোটাম) * (নতুন_পরিচালনা - নতুন_ নীচে) + নতুন_ নীচে পছন্দ করি;
ftrotter

4
কোথাও এই সমীকরণের জন্য কোনও উত্স আছে?
shaveenk

@ শাভেনেক এটি একটি রেখার সমীকরণ হওয়া উচিত Y=f(X)=m*X+b, যেখানে মি এবং বি নিম্নলিখিত দুটি সীমাবদ্ধ সমীকরণগুলি একই সাথে নির্ধারণ করা হয়েছে যা প্রয়োজনীয় প্রান্তে এক্স এবং ওয়াইয়ের মান স্থাপন করে: C=m*A+bএবংD=m*B+b
ক্রিস চিয়াসন

আমি X=A+(A-B)*tএই পদ্ধতির এবং পিটারের মধ্যে সাম্য প্রমাণ করার জন্য ব্যবহার করার প্রয়োজনও শেষ করেছি । T মূলত (এক্স একটি nondimensionalization হয় t=(X-A)/(A-B))
ক্রিস Chiasson

দিকটি উল্টো করতে সূত্রটি হ'ল ((এক্সএ) / (এবি) * (সিডি)) * -1 + ডি
কোরি লেভিনসন

21

দুটি রেঞ্জের আকারের মধ্যে অনুপাত পেতে ভাগ করুন, তারপরে আপনার ইনটিটাল রেঞ্জের শুরুর মানটি বিয়োগ করুন, অনুপাত দ্বারা গুণ করুন এবং আপনার দ্বিতীয় ব্যাপ্তির প্রারম্ভিক মান যুক্ত করুন। অন্য কথায়,

R = (20 - 10) / (6 - 2)
y = (x - 2) * R + 10

এটি দ্বিতীয় ব্যাপ্তির প্রথম ব্যাপ্তি থেকে সমানভাবে সংখ্যা ছড়িয়ে দেয়।


এটি কাজ করে না। আমার সীমার 9999999999 থেকে 1000000000 এবং সংখ্যার 1 থেকে 999999999. হতে পারে
Dejell

@ ওডেলিয়া অবশ্যই কাজ করে। এটি একটি সহজ যথেষ্ট গাণিতিক রূপান্তর। আপনার কেবলমাত্র একটি বড় পর্যাপ্ত সংখ্যার প্রকার (বিগনাম বা অনুরূপ) ব্যবহার করতে হবে। আপনার সংখ্যা 32 বিট পূর্ণসংখ্যার জন্য খুব বড় - তবে উদাহরণস্বরূপ 64৪ বিট পূর্ণসংখ্যার কাজ করবে।
কনরাড রুডল্ফ

তারা টাইপ ডাবল হয়। ডাবল আর = (20 - 10) / (6 - 2); ডাবল y = (এক্স - 2) * আর + 10;
দেজেল

@ ওডেলি একই সমস্যা যদিও। আপনার ভাসমান-পয়েন্ট যথার্থতা পড়তে হবে। প্রকৃতপক্ষে, এটি পড়ার প্রয়োজন: প্রতিটি কম্পিউটার বিজ্ঞানী ফ্লোটিং-পয়েন্ট এরিথমেটিক সম্পর্কে যা জানা উচিত - আপনার যদি এ জাতীয় বড় সংখ্যার সাথে একটি ভাসমান-পয়েন্ট টাইপের প্রয়োজন হয় তবে আপনাকে একটি স্বেচ্ছাচারিতা-নির্ভুলতা নম্বর টাইপ ব্যবহার করতে হতে পারে ।
কনরাড রুডল্ফ

আপনি কি জাভা টাইপের জন্য সুপারিশ করতে পারেন যা আমি এটি করতে পারি?
দেজেল

7

java.lang.Mathক্লাসে এই কার্যকারিতাটি রাখলে ভালো লাগবে, কারণ এটি এ জাতীয় বহুল প্রয়োজনীয় ফাংশন এবং অন্যান্য ভাষায় উপলভ্য। এখানে একটি সহজ বাস্তবায়ন:

final static double EPSILON = 1e-12;

public static double map(double valueCoord1,
        double startCoord1, double endCoord1,
        double startCoord2, double endCoord2) {

    if (Math.abs(endCoord1 - startCoord1) < EPSILON) {
        throw new ArithmeticException("/ 0");
    }

    double offset = startCoord2;
    double ratio = (endCoord2 - startCoord2) / (endCoord1 - startCoord1);
    return ratio * (valueCoord1 - startCoord1) + offset;
}

আমি এই কোডটি এখানে ভবিষ্যতের জন্য একটি রেফারেন্স হিসাবে রাখছি এবং এটি কারওর পক্ষে সহায়তা করবে will


4

একদিকে যেমন, ক্লাসিক রূপান্তর সেলসিয়াসকে ফারেনহাইটের মতো একই সমস্যা যেখানে আপনি একটি সংখ্যার পরিসীমা মানচিত্র করতে চান যেখানে 0 - 100 (সি) থেকে 32 - 212 (এফ) এর সমান হয় ates


এ কেমন উত্তর?
shinzou

এটি প্রশ্নের প্রয়োগের উদাহরণ। অনেকের প্রাথমিক সিএস ক্লাসে এই সাধারণ সমস্যা রয়েছে এবং তারা বিবেচনা করে না যে সমাধানটি অন্যান্য সমস্যার জন্য সাধারণীকরণ করা যেতে পারে। আমি মূল প্রশ্নের সাথে প্রসঙ্গ যুক্ত করার চেষ্টা করছিলাম। মূল প্রশ্নের ইতিমধ্যে যথেষ্ট উত্তর দেওয়া হয়েছিল।
মেট্রো


1

প্রথম ব্যাপ্তির প্রতিটি ইউনিটের ব্যবধান দ্বিতীয় ব্যাপ্তিতে (ডিসি) / (বা) "স্থান" নেয়।

সিউডো:

var interval = (d-c)/(b-a)
for n = 0 to (b - a)
    print c + n*interval

আপনি কীভাবে রাউন্ডিং পরিচালনা করবেন তা আপনার উপর নির্ভর করে।


1
int srcMin = 2, srcMax = 6;
int tgtMin = 10, tgtMax = 20;

int nb = srcMax - srcMin;
int range = tgtMax - tgtMin;
float rate = (float) range / (float) nb;

println(srcMin + " > " + tgtMin);
float stepF = tgtMin;
for (int i = 1; i < nb; i++)
{
  stepF += rate;
  println((srcMin + i) + " > " + (int) (stepF + 0.5) + " (" + stepF + ")");
}
println(srcMax + " > " + tgtMax);

অবশ্যই শূন্য দ্বারা বিভাজনের উপর চেক সহ।


1

যদি আপনার পরিসরটি [a থেকে b] হয়ে থাকে এবং আপনি [সি থেকে ডি] তে মানচিত্র তৈরি করতে চান যেখানে এক্স এই মানচিত্রটি ব্যবহার করতে চান তবে এই সূত্রটি ব্যবহার করুন (লিনিয়ার ম্যাপিং)

double R = (d-c)/(b-a)
double y = c+(x*R)+R
return(y)

0

@ পিটারএলেনওয়েব উত্তর ছাড়াও, আপনি যদি ফলাফলটি উল্টাতে চান তবে নীচের ব্যবহার করুন:

reverseX = (B-A)*(Y-C)/(D-C) + A

0

কোথায় এক্স থেকে ম্যাপ সংখ্যা একটি - বি থেকে সি - ডি , আর ওয়াই ফলাফল: রৈখিক ক্ষেপক সূত্র, lerp (নিন একটি , , মি ) = একটি + + ( মি * ( - একটি )), এবং করা সেঃ এবং ডি স্থানে একটি এবং পেতে ওয়াই = সি (+ + মি * ( ডি - সি ))। তারপরে, মিটার জায়গায় , ( এক্স - ) / ( ) * ( ডিবি - ) পাওয়ার জন্য ওয়াই = সি + ((( এক্স - )) / ( বি - )) * ( ডি - সি ))। এটি একটি ঠিক আছে মানচিত্রের ফাংশন, তবে এটি সরল করা যেতে পারে। ( ডি - সি ) টুকরোটি নিয়ে নিন এবং ওয়াই = সি + ((( এক্স - )) (( ডি - সি )) / ( বি - )) পেতে ডিভিডেন্ডের ভিতরে রেখে দিন । এটি আমাদের আরও সহজলভ্য করতে পারে এমন একটি অংশ দেয়, ( এক্স - - সি ), যা ( এক্স * ডি ) - ( এক্স * সি ) - ( * ডি ) + ( * সি ) এর সমান । এটি পপ করুন এবং আপনি Y = C + ((( এক্স * ডি ) - ( এক্স * সি ) - ( * ডি ) + ( * সি )) / ( বি - )) পাবেন। আপনার পরবর্তী কাজটি করতে হবে + সি বিটে যুক্ত করা। এটি করার জন্য, আপনি সি দ্বারা ( বি - এ) গুণাবেন) (( বি * সি ) - ( * সি )) পেতে এবং লভ্যাংশে সরান ওয়াই = ((( এক্স * ডি )) - ( এক্স * সি ) - ( * ডি ) + ( * ) ) + ( বি * সি ) - ( * সি )) / ( বি - )) এটি অপ্রয়োজনীয়, এতে দুটি ( * সি ) এবং এ - ( * সি ) রয়েছে, যা একে অপরকে বাতিল করে দেয়। এগুলি সরান, এবং আপনি এর চূড়ান্ত ফলাফল পাবেন:Y = (( এক্স * ডি ) - ( এক্স * সি ) - ( * ডি ) + ( বি * সি )) / ( বি - )

টিএল; ডিআর: স্ট্যান্ডার্ড মানচিত্রের ফাংশন, ওয়াই = সি + ((( এক্স - )) (( বি - )) * ( ডি - সি )) সরল করে ওয়াই = ( এক্স ( ডি * ডি )) - ( এক্স * সি ) - ( * ডি ) + ( বি * সি )) / ( বি - )

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