ম্যাটল্যাবে মানচিত্রের কাজ?


100

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

function results = map(f,list)
% why doesn't MATLAB have a Map function?
results = zeros(1,length(list));
for k = 1:length(list)
    results(1,k) = f(list(k));
end

end

ব্যবহার যেমন

map( @(x)x^2,1:10)

12
পাঠ # 1 অন্যান্য ভাষা থেকে মতলব যাচ্ছে: লুপগুলির জন্য ব্যবহার করবেন না, এগুলি ভেক্টরাইজড দ্রবণের চেয়ে ধীর গতির কয়েকটি আদেশ।
কুকি অফফোর্টুন

15
জেআইটি প্রবর্তনের সাথে সাথে, লুপগুলি যে দণ্ড তারা একবার করেছিল তা গ্রহণ করবে না।
মতলবডৌগ

@ কুকিঅফফোর্টুন আমি মনে করি এটি আর সত্য নয় ...
আন্ডার বিগুড়ি

4
আন্ডারবিগুড়ি আমার ধারণা তারা কিছু উন্নতি যুক্ত করেছে তবে এটি এখনও অনেক ধীর।
কুকিঅফফরুনিউন

প্রায়োগিক লাইব্রেরী ফাইল বিনিময় উপর হয়েছে map, foldl(এছাড়াও হিসাবে পরিচিত reduce), select(ওরফে filter), এবং অন্যান্য অপরিহার্য গুডিজ। প্রস্তাবিত (যদি আপনার মতলব ব্যবহার করতে হয়)।
আহমেদ ফাসিহ

উত্তর:


133

সংক্ষিপ্ত উত্তর: অন্তর্নির্মিত ফাংশন হ'ল সংখ্যার অ্যারেগুলির জন্য arrayfunআপনার mapফাংশনটি ঠিক কী করে:

>> y = arrayfun(@(x) x^2, 1:10)
y =

     1     4     9    16    25    36    49    64    81   100

অন্য দুটি অন্তর্নির্মিত ফাংশন রয়েছে যা একইভাবে আচরণ করে: cellfun(যা কোষের অ্যারেগুলির উপাদানগুলিতে পরিচালিত হয়) এবং structfun(যা কোনও কাঠামোর প্রতিটি ক্ষেত্রে কাজ করে)।

তবে, বিশেষত উপাদান-ভিত্তিক গাণিতিক অপারেটরগুলি ব্যবহার করে যদি আপনি ভেক্টরাইজেশনের সুবিধা গ্রহণ করেন তবে এই ফাংশনগুলি প্রায়শই প্রয়োজন হয় না । উদাহরণস্বরূপ, আপনি দিয়েছেন, একটি ভেক্টরাইজড সমাধানটি হ'ল:

>> x = 1:10;
>> y = x.^2
y =

     1     4     9    16    25    36    49    64    81   100

কিছু অপারেশন স্বয়ংক্রিয়ভাবে উপাদানগুলিতে কাজ করবে (যেমন কোনও ভেক্টরকে স্কেলারের মান যুক্ত করা হয়) অন্যদের অপারেটরগুলির কাছে উপাদান-ভিত্তিক ক্রিয়াকলাপের জন্য একটি বিশেষ বাক্য গঠন থাকে ( .অপারেটরের আগে কোনও দ্বারা বোঝানো হয় )। ম্যাটল্যাব-এ অনেকগুলি অন্তর্নির্মিত ফাংশন উপাদান-ভিত্তিক ক্রিয়াকলাপগুলি (প্রায়শই একটি নির্দিষ্ট মাত্রায় প্রয়োগ করা হয়, যেমন sumএবং meanউদাহরণস্বরূপ) ব্যবহার করে ভেক্টর এবং ম্যাট্রিক্স আর্গুমেন্টগুলিতে পরিচালনা করার জন্য ডিজাইন করা হয়েছে এবং সুতরাং মানচিত্রের কার্যকারিতা প্রয়োজন হয় না।

সংক্ষিপ্তসার হিসাবে, এখানে অ্যারের মধ্যে প্রতিটি উপাদান বর্গক্ষেত্রের কয়েকটি ভিন্ন উপায়:

x = 1:10;       % Sample array
f = @(x) x.^2;  % Anonymous function that squares each element of its input

% Option #1:
y = x.^2;  % Use the element-wise power operator

% Option #2:
y = f(x);  % Pass a vector to f

% Option #3:
y = arrayfun(f, x);  % Pass each element to f separately

অবশ্যই, এই জাতীয় অপারেশনের জন্য, বিকল্প # 1 সর্বাধিক বুদ্ধিমান (এবং দক্ষ) পছন্দ।


4
একটি নোট করা উচিত যে বিকল্প 1 শুধুমাত্র সহজ নয়, দ্রুতও হয় (বিকল্প 3, 2 এর সাথে 1 এর সাথে খুব মিল থাকতে হবে)!
ডিয়েডেরিক সি। নীহর্স্টার

10

ভেক্টর এবং উপাদান-ভিত্তিক ক্রিয়াকলাপগুলি ছাড়াও, cellfunসেল অ্যারেগুলিতে ম্যাপিংয়ের জন্য রয়েছে। উদাহরণ স্বরূপ:

cellfun(@upper, {'a', 'b', 'c'}, 'UniformOutput',false)
ans = 
    'A'    'B'    'C'

যদি 'ইউনিফর্মআউটপুট' সত্য হয় (বা সরবরাহ না করা হয়), এটি সেল অ্যারের মাত্রা অনুসারে ফলাফলকে একত্রিত করার চেষ্টা করবে, তাই

cellfun(@upper, {'a', 'b', 'c'})
ans =
ABC

2

মাতলাবের ভেক্টরাইজেশন ব্যবহারের পরিবর্তে একটি সহজ সমাধান হ'ল:

a = [ 10 20 30 40 50 ]; % the array with the original values
b = [ 10 8 6 4 2 ]; % the mapping array
c = zeros( 1, 10 ); % your target array

এখন, টাইপিং

c( b ) = a

প্রত্যাবর্তন

c = 0    50     0    40     0    30     0    20     0    10

গ (খ) হ'ল বি দ্বারা প্রদত্ত সূচকগুলিতে সি এর উপাদানগুলির সাথে 5 আকারের ভেক্টরের একটি রেফারেন্স। এখন আপনি যদি এই রেফারেন্স ভেক্টরের মানগুলিকে আশ্বাস দিচ্ছেন, সিতে মূল মানগুলি ওভাররাইট করা হয়, যেহেতু সি (খ) এর সি এর মানগুলির কোনও রেফারেন্স থাকে এবং কোনও অনুলিপি থাকে না।


1

দেখে মনে হচ্ছে যে বিল্ট-ইন অ্যারেফুনটি যদি ফলাফলটির কাজগুলির একটি অ্যারে থাকে তবে কাজ করে না: উদাহরণস্বরূপ: মানচিত্র (@ (x) [xx ^ 2 x ^ 3], 1: 10)

নীচে সামান্য মোডগুলি এই কাজটিকে আরও ভাল করে তোলে:

function results = map(f,list)
% why doesn't MATLAB have a Map function?
for k = 1:length(list)
    if (k==1)
        r1=f(list(k));
        results = zeros(length(r1),length(list));
        results(:,k)=r1;
    else
        results(:,k) = f(list(k));

    end;
end;
end

5
আরআরএফইউন আপনার উদাহরণের জন্য কাজ করবে, ..., 'UniformOutput', false);আপনার অ্যারে সম্বলিত একটি সেল অ্যারে আউটপুট তৈরি করতে আপনাকে কেবল ইনপুট আর্গুমেন্টগুলি অন্তর্ভুক্ত করতে হবে , তারপরে বিন্যাস করতে হবে এবং সেগুলি সংহত করতে হবে তবে আপনি কোনও সেল-বিন্যাসে না চান।
জিনোভাইস

0

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

অন্য কথায়, এটি


a = 1:10;
a.^2

এই তুলনায় অনেক দ্রুত


a = 1:10;
map(@(x)x^2, a)

মানচিত্রের আপনার সংজ্ঞাটি ধরে নিচ্ছি।


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

4
বেশিরভাগ বিল্ট-ইন মতলব ফাংশন এবং অপারেটররা ইতিমধ্যে তা করে থাকে: তারা ইনপুট অ্যারের প্রতিটি উপাদানগুলিতে কাজ করে এবং ফলাফলের সাথে সম্পর্কিত একটি অ্যারে ফেরত দেয়।
দিমা

0

আপনার কোনও প্রয়োজন নেই mapযেহেতু কোনও স্কেলারের ফাংশন যা মানগুলির তালিকার সাথে প্রয়োগ করা হয় প্রতিটি মানগুলিতে প্রয়োগ হয় এবং তাই এর অনুরূপ কাজ করে map। ঠিক করার চেষ্টা করুন

l = 1:10
f = @(x) x + 1

f(l)

আপনার বিশেষ ক্ষেত্রে, আপনি এমনকি লিখতে পারে

l.^2

9
-1: এটি আসলে সত্য নয়। মাতালাবের স্কেলারের কার্যকারিতা নির্দিষ্ট করার জন্য কোনও প্রকারের মতো শক্তিশালী সিস্টেম নেই। f কে ভেক্টরের সাথে ডাকা হয় এবং আপনার উদাহরণে একটি ভেক্টর সংযোজন করা হয়। এটি যাচাই করতে, আপনার কোড নমুনা (কোড চালানোর আগে "প্রোফাইলে", তারপরে "প্রোফাইল অফ রিপোর্ট") প্রোফাইল করুন। আপনি দেখতে পাবেন যে চ একটি কল আছে।
মিঃ ফুজ

-1

পূর্ববর্তী উত্তরে বর্ণিত সমাধানটিকে ভেক্টরাইজ করা গতির সম্ভবত সম্ভবত সেরা সমাধান। ভেক্টরাইজিংও খুব মাতলাবি এবং ভাল লাগে।

এই বলে যে মতলব এখন মানচিত্রের ধারক শ্রেণি আছে।

Http://www.mathworks.com/help/matlab/map-containers.html দেখুন


ওপি উচ্চতর অর্ডার ফাংশনটির কথা বলছে, অর্থাত্ cellfunহ্যাশ টেবিল বা কী-মান জোড়া নয় pairs
আহমেদ ফাসিহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.