ভে

ভেক্টর মধ্যে Julia

১টি অনুশীলনী

ভেক্টর সম্পর্কে

জুলিয়ার একটি কেন্দ্রীয় লক্ষ্য হলো সংখ্যাগত ডেটার ওপর দ্রুত ও দক্ষভাবে গণনা করা। অনেক সংখ্যাগত ডেটা।

সাধারণত এই ডেটা অ্যারেতে (বা সম্পর্কিত কোনো টাইপে) সংরক্ষণ করা হয়, তাই এটা বলা ন্যায্য যে জুলিয়া ভাষার একেবারে কেন্দ্রে আছে অ্যারে।

অ্যারে যত খুশি বড় হতে পারে (শুধু আপনার হার্ডওয়্যারের মেমোরির সীমাবদ্ধতার অধীন), আর এর মাত্রাও যত খুশি হতে পারে।

কিছু ধরনের অ্যারের বিশেষ নাম আছে (লিনিয়ার অ্যালজেব্রা থেকে নেওয়া)। একমাত্রিক অ্যারেকে Vector আর দ্বিমাত্রিক অ্যারেকে Matrix বলা হয়। জুলিয়ায় দুটোই Array-এর সাবটাইপ।

এই প্রারম্ভিক কনসেপ্টে মূলত ভেক্টরের বেসিক বিষয়গুলো নিয়ে আলোচনা করা হয়েছে। উচ্চমাত্রিক অ্যারে নিয়ে সিলেবাসে পরে আলোচনা করা হবে।

ভেক্টর তৈরি করা

জুলিয়ায় একটি Vector হলো মানের একটি ক্রমসজ্জিত সিকোয়েন্স, যার প্রতিটি মান ইনডেক্স নম্বর দিয়ে অ্যাক্সেস করা যায়।

ভেক্টর তৈরির সবচেয়ে সহজ উপায় হলো তৃতীয় বন্ধনীর ভেতরে মানগুলো তালিকা আকারে লেখা:

julia> num_vec = [1, 4, 9]
3-element Vector{Int64}:
 1
 4
 9

julia> str_vec = ["arrays", "are", "important"]
3-element Vector{String}:
 "arrays"
 "are"
 "important"

ভেক্টরের টাইপ প্রতিটি এলিমেন্টের টাইপের সাথে মিলে যায়।

প্রকৃতপক্ষে এটি একটি কলাম ভেক্টর, তবে লিনিয়ার অ্যালজেব্রার সাথে পরিচিত না থাকলে আপাতত এটি বাদ দিন। বহুমাত্রিক অ্যারে কনসেপ্টের পরে বিষয়টি আরও বোধগম্য হবে।

তাহলে ভেক্টরকে সমজাতীয় হতে হবে (সব এলিমেন্ট একই টাইপের)?

এক অর্থে হ্যাঁ, আর সেরা পারফরম্যান্স চাইলে এটাই লক্ষ্য রাখার পরামর্শ দেওয়া হয়। তবে প্রয়োজনে জুলিয়া Any টাইপ ব্যবহার করে এই সীমাবদ্ধতা পাশ কাটিয়ে যেতে পারে:

julia> mixed_vector = [1, "str", 'c']
3-element Vector{Any}:
 1
  "str"
  'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)

খালি ভেক্টর তৈরি করার সময় জুলিয়া ডিফল্ট হিসেবে এলিমেন্ট টাইপ Any নেয়, তবে খালি অ্যারেটির ওপর কাঙ্ক্ষিত এলিমেন্ট টাইপ অ্যানোটেট করে এটি আরও নির্দিষ্টভাবে ঠিক করা যায়।

julia> empty_vec = []
Any[]

julia> empty_int_vec = Int64[]
Int64[]

আগে থেকে ভরা ভেক্টর

সব মান ০ বা সব মান ১ দিয়ে ভেক্টর শুরু করা খুবই সাধারণ ব্যাপার। এগুলোর জন্য (আশ্চর্যের কিছু নেই যে) zeros() আর ones() নামে ফাংশন আছে, যেগুলো প্যারামিটার হিসেবে ভেক্টরের আকার নেয়। ডিফল্ট টাইপ Float64, তবে চাইলে অন্য সংখ্যাসূচক টাইপও উল্লেখ করা যায়।

একইভাবে fill() ফাংশনটি পুনরাবৃত্তি করার একটি মান এবং কাঙ্ক্ষিত ভেক্টরের আকার, দুটোই নেয়।

julia> zeros(3)
3-element Vector{Float64}:
 0.0
 0.0
 0.0

julia> ones(3)
3-element Vector{Float64}:
 1.0
 1.0
 1.0

julia> ones(Int64, 3)
3-element Vector{Int64}:
 1
 1
 1

julia> fill(42, 3)
3-element Vector{Int64}:
 42
 42
 42

আরও অনেক বিকল্প আছে: দেখুন ম্যানুয়াল।

অনুগ্রহ করে এই নিয়মটি পড়ুন এবং মনে রাখুন:

  • ডিফল্টভাবে জুলিয়ায় ইনডেক্সিং শুরু হয় ১ থেকে, ০ থেকে নয়।

অন্য ডেটা সায়েন্স ভাষা (R, Matlab, Fortran...) ব্যবহার করেছেন যারা, তাদের কাছে এটি পরিচিত ব্যাপার, কিন্তু C-এর মতো ভাষার পটভূমি আছে এমন কম্পিউটার বিজ্ঞানীদের কাছে এটি হঠাৎ ধাক্কার মতো লাগতে পারে।

অন্যথায় ইনডেক্স কাজ করে আপনার ধারণা অনুযায়ীই: শুধু সেগুলো তৃতীয় বন্ধনীর ভেতরে লিখুন:

squares = [0, 1, 4, 9, 16]
squares[1]  # 0
squares[3]  # 4
squares[begin]  # 0 ("begin" is synonym for 1)
squares[end]  # 16 ("end" is synonym for length(squares))

end দিয়ে ইনডেক্স করার সুবিধাটা খেয়াল করুন (এটি খুবই কাজের) এবং begin দিয়েও (যা সম্ভবত তেমন কাজের নয়)।

Python প্রোগ্রামাররা হয়তো ঋণাত্মক ইনডেক্স নিয়ে ভাবছেন। ভাববেন না: এগুলো জুলিয়ার অংশ নয়, আর এগুলো ব্যবহার করলে BoundsError উঠবে, ঠিক যেমন ১-এর চেয়ে ছোট বা length(squares)-এর চেয়ে বড় যেকোনো ইনডেক্সে হবে।

ভেক্টর অপারেশন

জুলিয়ায় ভেক্টর মিউটেবল: আমরা আলাদা আলাদা সেলের ভেতরের মান বদলাতে পারি।

julia> vals = [1, 3, 5, 7]
4-element Vector{Int64}:
 1
 3
 5
 7

julia> vals[2] = 4  # reassign the value of this element
4

# Only the value at position 2 changes:
julia> vals
4-element Vector{Int64}:
 1
 4
 5
 7

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

মনে রাখবেন, রীতি অনুযায়ী যে ফাংশনগুলো নিজের ইনপুট মিউটেট করে, তাদের নামে ! থাকে। কম্পাইলার এটি মানতে বাধ্য করে না, কিন্তু জুলিয়ার জগতে এটি একটি অত্যন্ত শক্ত রীতি।

কাজের এমন কয়েকটি ফাংশন হলো:

  • ভেক্টরের শেষে মান যোগ করতে ব্যবহার করুন push!()।
  • শেষের মানটি সরাতে ব্যবহার করুন pop!()।
  • ভেক্টরের শুরুতে কাজ করতে সংশ্লিষ্ট ফাংশন দুটি হলো pushfirst!() এবং popfirst!()।
  • যেকোনো অবস্থানে একটি এলিমেন্ট যোগ বা সরাতে আছে insert!() এবং deleteat!()।
julia> vals = [1, 3]
2-element Vector{Int64}:
 1
 3

julia> push!(vals, 5, 6)  # can add multiple values
4-element Vector{Int64}:
 1
 3
 5
 6

julia> pop!(vals)  # mutates vals, return popped value
6

julia> vals
3-element Vector{Int64}:
 1
 3
 5

কনক্যাটেনেশন

ভেক্টরের ক্ষেত্রে কনক্যাটেনেশন বেশ সহজ, যদিও ম্যানুয়ালে এক নজর চোখ বুলালেই সতর্কবার্তা মেলে: বহুমাত্রিক অ্যারে নিয়ে ভাবলে জটিলতা অপেক্ষা করছে।

append!() ফাংশনটি ইনপুট হিসেবে কয়েকটি ভেক্টর আর একক এলিমেন্টের মিশ্রণ নিতে পারে।

julia> append!([1, 2], [3, 4], [-1, -2], 15)
7-element Vector{Int64}:
  1
  2
  3
  4
 -1
 -2
 15
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

ভেক্টর শিখুন