ম্যাটল্যাবে গল্ফ করার টিপস


14

ম্যাটল্যাবে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে গল্ফ সমস্যাগুলিতে প্রয়োগ করা যেতে পারে যা ম্যাটল্যাবের সাথে অন্তত কিছুটা নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)। দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।


3
সম্পর্কিত, তবে কোনও সদৃশ নয়:
অক্টাভাতে

উত্তর:


10

গল্ফ শুরু করার আগে এমন কিছু যা জানতে হবে:

ম্যাটল্যাব গণনায় একটি চরিত্র তার আসকি কোডের মতো আচরণ করে।

'abc' - 'a'  % Returns: [0 1 2]
'123' - '0'  % Returns: [1 2 3]
'“' == 8220  % Returns: 1 (logical)
'a':'e'==100 % Returns: [0 0 0 1 0] (logical)

9

সম্পত্তির নাম ছোট করা

ম্যাটল্যাবে, বৈশিষ্ট্য চিহ্নিতকরণের স্ট্রিংগুলি সংক্ষিপ্ত করা যেতে পারে যতক্ষণ না এটি অস্পষ্টতার ফলে না আসে।

plot(X,'C','k') % Ambiguous property found.
plot(X,'Co','k') % Expands to Color  (black)

এটি আসলে আমার চ্যালেঞ্জ জিতল :)


2
খুব সুন্দর, যদিও উত্তরটি সঠিক, আমি জোর দিয়ে বলতে চাই যে এটি name, valueউপরের মতো দেখানো অনুসারে জোড়ার নামে প্রযোজ্য । (সুতরাং এর মতো বিষয়গুলিতে নয় sort(rand(4,1),'descend'))
ডেনিস জাহেরউদ্দিন

1
এটি সেগুলির conv(1:5,[1 1],'s')conv(1:5,[1 1],'same')
লুইস মেন্ডো

6

চর হিসাবে কাস্টিং একটি চরের সাথে সংমিশ্রণ দ্বারা করা যেতে পারে:

x='a'+magic(5) % Array with character codes of several letters

char(x) % The standard way
['' x] % The compact way

যদিও এটি কেবল একটি চর বাঁচায়, এটি বেশ ঘন ঘন ব্যবহার করা যেতে পারে।


5

স্ট্রিংগুলি কেবল অক্ষর সারি ভেক্টর। এর পরিবর্তে এর অর্থ

for i=numel(str)
    a=str(i)
    ...
end

আপনি সহজভাবে লিখতে পারেন

for(a=str)
    ...
end

আমি প্রথমবার এটি ব্যবহার করেছি: /codegolf//a/58387/32352


4

স্বতন্ত্র ফুরিয়ার রূপান্তর মাধ্যমে unityক্যের শিকড়

একটি ধনাত্মক পূর্ণসংখ্যা দেওয়া n, আদর্শ উপায় জেনারেট করতে n-th শিকড় ঐক্য হয়

exp(2j*pi*(0:n-1)/n)

এটি শিকড়কে 1ইতিবাচক কৌণিক দিকে শুরু করে এবং চলতে দেয় । যদি অর্ডারটি কোনও বিষয় না দেয় তবে এটি সংক্ষিপ্ত করা যেতে পারে

exp(2j*pi*(1:n)/n)

যেহেতু exp(2j*pi/4)কাল্পনিক ইউনিট ( j) এর সমান, তাই এটি আরও কমপ্লেট করে নিম্নরূপে লেখা যেতে পারে ( @ ফ্লোয়ারের কারণে কৌশল ):

j.^(4*(0:n-1)/n)

অথবা

j.^(4*(1:n)/n)

তবে পৃথক ফুরিয়ার রূপান্তরটি আরও ছোট একটি উপায় প্রদান করে (দুটি অপ্রয়োজনীয় প্রথম বন্ধনী অপসারণের জন্য @ ফ্লোয়ারকে ধন্যবাদ):

fft(1:n==n)

যা শিকড়কে 1ইতিবাচক কৌণিক দিক থেকে শুরু করে এবং চলতে দেয় ; অথবা

fft(1:n==2)

যা শুরু হয় 1এবং নেতিবাচক কৌণিক দিকে চলে যায়।


উপরের সমস্ত এখানে চেষ্টা করুন


দুর্দান্ত কৌশল! এমনকি আপনি এটিকে গল্ফ করতে পারেনfft(1:n==2)
flawr

@ ফ্লোয়ার আমি অগ্রাধিকারের নিয়মগুলি কখনই জানি না ... ধন্যবাদ!
লুইস মেন্ডো

3

nnz কখনও কখনও আপনাকে কয়েকটি বাইট সংরক্ষণ করতে পারে:

  • কল্পনা করুন যে আপনি একটি লজিকাল ম্যাট্রিক্সের যোগফল চান Asum(sum(A))বা এর পরিবর্তে sum(A(:)), আপনি ব্যবহার করতে পারেন nnz(a)( nnzঅনিচ্ছাকৃতভাবে প্রযোজ্য (:))।
  • যদি আপনি কোনও অ্যারের উপাদানগুলির সংখ্যা জানতে চান এবং আপনি নিশ্চিত হয়ে যেতে পারেন যে কোনও জিরো নেই, পরিবর্তে numel(x)আপনি ব্যবহার করতে পারবেন nnz(x)। এটি xস্ট্রিং হলে উদাহরণস্বরূপ প্রযোজ্য ।

3

ম্যাট্রিকগুলিতে ভেক্টরগুলির উপরে আইট্রেশন।

ম্যাট্রিক্স হিসাবে ভেক্টর একটি সেট দেওয়া, আপনি লুপ মত একটি একক মাধ্যমে আসলে তাদের উপর পুনরাবৃত্তি করতে পারেন

for v=M
    disp(v);
end

যদিও "traditionতিহ্যগতভাবে" আপনি সম্ভবত এটি করতেন

for k=1:n
    disp(M(:,k));
end

আমি এই চ্যালেঞ্জটি কেবলমাত্র এখনই @ সুইভার থেকে এই কৌশল সম্পর্কে শিখেছি ।


3

সম্পর্কিত, তবে অষ্টাভের জন্য অভিন্ন টিপস নয় ।

ম্যাটল্যাব এবং অকটাভ উভয়েরই একটি সামান্য জ্ঞাত এবং সামান্য ব্যবহৃত বৈশিষ্ট্য হ'ল বেশিরভাগ বিল্টিন ফাংশনগুলি প্রথম বন্ধনী ছাড়াই কল করা যেতে পারে, সেক্ষেত্রে তারা যা অনুসরণ করে তা স্ট্রিং হিসাবে বিবেচনা করবে (যতক্ষণ না এতে স্পেস থাকে না)। যদি এটিতে ফাঁকা স্থান থাকে তবে আপনার উদ্ধৃতি চিহ্নের প্রয়োজন। এটি ঘন ঘন ব্যবহার করার সময় একটি বাইট সংরক্ষণ করতে ব্যবহার করা যেতে পারে disp:

disp('Hello, World!')
disp 'Hello, World!'

অন্যান্য, কম দরকারী উদাহরণগুলির মধ্যে রয়েছে:

nnz PPCG
ans = 4

size PPCG
ans = 1  4

str2num 12
ans = 12

আমি আসলে এটি "আপনি কত উচ্চ গুণতে পারেন?" এ দুবার ব্যবহার করেছি -challenge:

strchr sssssssssssssst t

সমান strchr('sssssssssssssst','t')এবং ফেরত 15

nnz nnnnnnnnnnnnnn

সমান nnz('nnnnnnnnnnnnnn')এবং ফেরত 14

স্টাফ যেমন gt r sকাজ করে (সমান 'r'>'s'বা এর সমতুল্য) gt('r','s')


2

অন্তর্নির্মিত onesএবং zerosসাধারণত জায়গার অপচয় হয়। আপনি কেবল একই অ্যারে / ম্যাট্রিক্সকে (পছন্দসই আকারের) 0 দ্বারা (এর আউটপুট পেতে zeros) এবং এটির আউটপুট চাইলে 1 যুক্ত করে একই ফলাফল অর্জন করতে পারেন ones

d = rand(5,2);

%// Using zeros
z = zeros(size(d));

%// Not using zeros
z = d*0;

%// Using ones
o = ones(size(d));

%// Not using ones
o = 1+d*0

আপনি যদি জিরোসের কলাম বা সারি ভেক্টর তৈরি করতে চান বা কোনও ম্যাট্রিক্সের এক মাত্রার আকার চান তবে এটিও কাজ করে।

p = rand(5,2);

z = zeros(size(p,1), 1);
z = 0*p(:,1);

o = ones(size(p, 1), 1);
o = 1+0*p(:,1);

আপনি যদি কোনও নির্দিষ্ট আকারের ম্যাট্রিক্স তৈরি করতে চান zerosতবে আপনি ব্যবহার করতে পারেন তবে আপনি শেষ উপাদানটি 0 এও দিতে পারেন এবং ম্যাটল্যাবটি বাকিটি পূরণ করতে পারেন।

%// This
z = zeros(2,3);

%// vs. This
z(2,3) = 0;

2
আমি ~(1:n)1-ডি শূন্য ভেক্টর ব্যবহার করতে চাই ।
সিনট্যাক্স

2

2D কনভোলিউশন কার্নেলগুলি

এটি সম্ভবত একটি কুলুঙ্গিক বিষয়, তবে দৃশ্যত কিছু লোক এখানে বিভিন্ন জিনিসের জন্য কনভোলশন ব্যবহার করতে পছন্দ করেন। [হদফ ঘ]

2 ডি তে নিম্নলিখিত কার্নেলগুলি প্রায়শই প্রয়োজন হয়:

0 1 0
1 1 1
0 1 0

এটি ব্যবহার করে অর্জন করা যেতে পারে

v=[1,2,1];v'*v>1 %logical
v=[1,0,1];1-v'*v  %as numbers

যা তার চেয়ে ছোট is

[0,1,0;1,1,1;0,1,0]

আরেকটি কার্নেল প্রায়শই ব্যবহৃত হয়

0 1 0
1 0 1
0 1 0

যা ব্যবহার করে সংক্ষিপ্ত করা যেতে পারে

v=[1,-1,1];v'*v<0   % logical
[0,1,0;1,0,1;0,1,0] % naive verison

সংখ্যা হিসাবে দ্বিতীয় কার্নেল, একই বাইট গণনা:toeplitz([0 1 0])
লুইস মেন্ডো

2

আমি প্রায়শই নিজেকে ব্যবহার করে দেখতে পাই meshgridবা ndgrid, ধরা যাক আমরা একটি ম্যান্ডেলব্রোট চিত্র গণনা করতে চাই, তারপরে আমরা উদাহরণস্বরূপ সূচনা করি

[x,y]=meshgrid(-2:1e-2:1,-1:1e-2,1)

এখন ম্যান্ডেলব্রোট সেটের cজন্য আমাদের আকারের আরও একটি ম্যাট্রিক্স প্রয়োজন xএবং yতবে জিরো দিয়ে আরম্ভ করা হয়েছে। এটি সহজেই লেখার মাধ্যমে করা যেতে পারে:

c=x*0;

আপনি এটিকে অন্য কোনও মান দিয়ে শুরু করতে পারেন:

c=x*0+3;

তবে আপনি এখানে আরও একটি মাত্রা যুক্ত করে কিছু বাইট সংরক্ষণ করতে পারেন meshgrid/ndgrid:

[x,y,c]=meshgrid(-2:1e-2:1,-1:1e_2,1, 0); %or for the value 3
[x,y,c]=meshgrid(-2:1e-2:1,-1:1e_2,1, 3);

এবং আপনি এটি যতবার ইচ্ছা এটি করতে পারেন:

[x,y,c1,c2,c3,c4,c5]=meshgrid(-2:1e-2:1,-1:1e_2,1, 1,pi,exp(3),1e5,-3i)

মনে রাখবেন যে ইতিমধ্যে স্বয়ংক্রিয় সম্প্রচার হচ্ছে: অনেক ক্ষেত্রে প্রথম উদাহরণটি প্রতিস্থাপন করা যেতে পারে x=-2:1d-2:1;y=x'
flawr

0

ক্রিয়াকলাপগুলির ক্রমের সংমিশ্রণ

  • ফাংশনগুলি সংক্ষেপণের জন্য f (x_n) যেখানে n ক্রমাগত পূর্ণসংখ্যার ভেক্টর, সিমসামের পরিবর্তে ফ্যাভালকে পরামর্শ দেওয়া হয়।

    Syms x;symsum(f(x),x,1,n);
    Sum(feval(@(x)f(x),1:n));
    

    লক্ষ্য করুন যে প্রাথমিক ক্রিয়াকলাপটি .*এবং ./জোড়াযুক্ত বাইনারি অপারেশনগুলির পরিবর্তে *এবং প্রয়োজনীয়/

  • ফাংশনটি যদি নির্লজ্জভাবে লেখা যায় তবে শেষের দুটি উপায় থেকে কেউই উপযুক্ত নয়।

    উদাহরণস্বরূপ যদি ফাংশনটি হয় তবে logআপনি সহজেই করতে পারেন:, sum(log(1:n))যা প্রতিনিধিত্ব করে:

    Sum(f(1:n));
    

    তুলনামূলকভাবে পরিশীলিত কার্যাবলীর জন্য log(n)/x^nআপনি যা করতে পারেন:

    Sum(log(1:n)./5.^(1:n))
    

    এমনকি কিছু ক্ষেত্রে এমনকি সংক্ষিপ্ত যখন কোনও ফাংশন হিসাবে দীর্ঘ হয় f(x)=e^x+sin(x)*log(x)/x....

    Sum(feval(@(y)e.^(y)+sin(y).*log(y)./y,1:n))
    

    যে তুলনায় উল্লেখযোগ্যভাবে খাটো sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))


দ্রষ্টব্য: এই কৌশলটি অন্যান্য অন্তর্ভুক্ত অপারেটরগুলির জন্য prodবা হিসাবে প্রয়োগ করা যেতে পারেmean


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