Kontent qismiga oʻtish

Matlabda simvolli differentsiallash

Vikipediya, ochiq ensiklopediya

Informatikada massiv dasturlash bir vaqtning oʻzida butun qiymatlar toʻplamiga amallarni qoʻllash imkonini beruvchi yechimlarni bildiradi. Bunday yechimlar odatda ilmiy va muhandislik sharoitida qoʻllaniladi.

Massiv dasturlashni qoʻllab-quvvatlaydigan zamonaviy dasturlash tillari (shuningdek, vektor yoki koʻp oʻlchovli tillar nomi bilan ham tanilgan) [[skalyar (hisoblash)|skalyar] boʻyicha operatsiyalarni umumlashtirish uchun maxsus ishlab chiqilgan. vektorlarga, [[matritsaga] shaffof qoʻllash uchun ]s. (matematika)|matritsalar]] va yuqori oʻlchamli massivlar. Bularga APL, J, Fortran, MATLAB, Analytica, [ [GNU Oktava|Oktava]], R, Cilk Plus, Julia, Perl Data Language (PDL). Bu tillarda butun massivlarda ishlaydigan operatsiyani vektorlashtirilgan operatsiya deb atash mumkin,[1] [[vektor], qaysi protsessorda bajarilganidan qat'iy nazar vektor ko'rsatmalarini amalga oshiradi. Massiv dasturlash ibtidoiylari ma'lumotlarni manipulyatsiya qilish haqidagi keng g'oyalarni qisqacha ifodalaydi. Muayyan holatlarda ixchamlik darajasi keskin bo'lishi mumkin: bir necha sahifali ob'ektni talab qiladigan massiv dasturlash tilini bir chiziqli topish kamdan-kam hollarda Andoza:Misol kerak yoʻnaltirilgan kod.

Masiv tushunchalari

[tahrir | manbasini tahrirlash]

Massiv dasturlashning asosiy gʻoyasi shundan iboratki, operatsiyalar bir vaqtning oʻzida butun qiymatlar toʻplamiga qoʻllaniladi. Bu uni yuqori darajali dasturlash modeliga aylantiradi, chunki u dasturchiga alohida skalyar operatsiyalarning aniq tsikllariga murojaat qilmasdan, butun maʼlumotlar yigʻindisi ustida fikr yuritish va ishlash imkonini beradi.

Kennet E. Iverson massiv dasturlash asosini (aslida APLga ishora qiladi) quyidagicha taʼriflagan:[2]

ko'pchilik dasturlash tillari matematik belgilardan ancha past va amaliy matematik tomonidan ahamiyatli deb hisoblanishi mumkin bo'lgan fikrlash vositasi sifatida kam qo'llaniladi.

Tezis shundan iboratki, dasturlash tillarida topilgan bajariluvchanlik va universallik afzalliklarini yagona izchil tilda matematik belgilar taqdim etadigan afzalliklar bilan samarali birlashtirish mumkin. nota parchasini tasvirlash va o‘rganish qiyinligini uning mazmunini o‘zlashtirish qiyinligidan farqlash muhimdir. Masalan, matritsa mahsulotini hisoblash qoidalarini o‘rganish oson, lekin uning ta’sirini o‘zlashtirish (masalan, uning assotsiativligi, qo‘shish bo‘yicha taqsimlanishi, chiziqli funksiyalar va geometrik amallarni ifodalash qobiliyati) boshqa va ancha murakkab masala. .

Darhaqiqat, yozuvning o'ziga xosligi, tadqiqot uchun taklif qiladigan ko'plab xususiyatlar tufayli o'rganishni qiyinlashtirishi mumkin.

[...]

Kompyuterlar va dasturlash tillaridan foydalanuvchilar ko'pincha algoritmlarni bajarish samaradorligi bilan bog'liq va shuning uchun bu erda keltirilgan ko'plab algoritmlarni rad etishlari mumkin. Bunday ishdan bo'shatish uzoqni ko'ra olmaydi, chunki algoritmning aniq bayoni odatda yanada samaraliroq algoritmni olish uchun asos sifatida ishlatilishi mumkin.

Massivlarni dasturlash va fikrlashning asosi alohida elementlar oʻxshash yoki qoʻshni boʻlgan maʼlumotlarning xususiyatlarini topish va ulardan foydalanishdir. Maʼlumotni uning tarkibiy qismlariga (yoki skalyar miqdorlarga) bilvosita ajratadigan ob’ekt yoʻnalishidan farqli oʻlaroq, massiv yoʻnalishi maʼlumotlarni guruhlash va bir xil ishlov berishni qoʻllashga qaraydi.

Funksiya darajasi matematikadagi tensor darajasiga oʻxshab, umuman massiv dasturlash tillari uchun muhim tushunchadir: maʼlumotlarda ishlaydigan funksiyalar ular taʼsir qiladigan oʻlchamlar soniga qarab tasniflanishi mumkin. Oddiy koʻpaytirish, masalan, skalyar darajali funktsiyadir, chunki u nol oʻlchovli maʼlumotlar (alohida raqamlar) bilan ishlaydi. oʻzaro mahsulot operatsiyasi vektor darajali funksiyaga misol boʻladi, chunki u skalerlarda emas, vektorlarda ishlaydi. Matritsalarni ko'paytirish 2 darajali funksiyaga misol boʻladi, chunki u 2 oʻlchovli ob’ektlar (matritsalar) ustida ishlaydi. Operatorlarni yigʻish kirish maʼlumotlar massivining oʻlchamini bir yoki bir nechta oʻlchamga kamaytiradi. Masalan, elementlarni yigʻish kirish massivini 1 oʻlchamga qisqartiradi.

Massivlarni dasturlash noto'g'ri parallellashtirish uchun juda mos keladi; hozirgi kunda koʻp tadqiqot mavzusi. Bundan tashqari, Intel va 1997 yildan keyin ishlab chiqilgan va ishlab chiqarilgan mos protsessorlar MMX dan boshlab SSSE3 va 3DNow!gacha davom etadigan turli koʻrsatmalar toʻplami kengaytmalarini oʻz ichiga olgan. ibtidoiy SIMD massiv imkoniyatlarini oʻz ichiga oladi. Bu 2020-yillarda AVX-512 kabi koʻrsatmalar toʻplamlari bilan davom etdi va zamonaviy protsessorlarni murakkab vektor protsessorlariga aylantirdi. Massivni qayta ishlash parallel ishlov berish dan farq qiladi, chunki bitta fizik protsessor bir vaqtning oʻzida bir guruh elementlar ustida operatsiyalarni bajaradi, parallel ishlov berish esa kattaroq muammolarni kichikroqlarga ajratishga qaratilgan ([[Bir nechta ko'rsatmalar, bir nechta ma'lumotlar|MIMD] ]) koʻplab protsessorlar tomonidan qisman hal qilinadi. 2023 yildan boshlab koʻp yadroli va minglab umumiy hisoblash yadrolariga ega GPU protsessorlari keng tarqalgan.

Massiv dasturlash tillarining kanonik misollari Fortran, APL va J. Boshqalarga quyidagilar kiradi: A+, Analytica, Chapel, IDL, Julia, K, Klong, Q, MATLAB, GNU Octave, Scilab, FreeMat, Perl Data Language (PDL), R, Raku, S-Lang, SAC, Nial, ZPL, Futhark va TI-BASIC.

Skalar tillar

[tahrir | manbasini tahrirlash]

C va Paskal kabi skalyar tillarda amallar faqat bitta qiymatlar uchun amal qiladi, shuning uchun a+b ikkita raqamni qoʻshish. Bunday tillarda bir massivni boshqa massivga qoʻshish indekslash va tsiklni talab qiladi, ularni kodlash zerikarli.

uchun (i = 0; i < n; i++)
uchun (j = 0; j < n; j++)
a[i][j] += b[i][j];

Massivga asoslangan tillarda, masalan, Fortranda, yuqorida joylashgan for-loop bir qatorda massiv formatida yozilishi mumkin,

a = a + b

yoki muqobil ravishda, ob’ektlarning massiv tabiatini taʼkidlash uchun,

a(:,:) = a(:,:) + b(:,:)

Si kabi skalyar tillar tilning bir qismi sifatida mahalliy massiv dasturlash elementlariga ega boʻlmasa-da, bu bu tillarda yozilgan dasturlar vektorlashtirishning asosiy usullaridan hech qachon foydalanmaydi degani emas (yaʼni, protsessor vektorga asoslangan koʻrsatmalar agar ular mavjud boʻlsa yoki bir nechta CPU yadrolari yordamida). Baʼzi bir optimallashtirish darajalarida GCC kabi baʼzi C kompilyatorlari uning evristikasi undan foyda olishini aniqlaydigan kod boʻlimlarini aniqlaydi va vektorlashtiradi. Yana bir yondashuv OpenMP API tomonidan taqdim etilgan boʻlib, u bir nechta protsessor yadrolaridan foydalangan holda kodning tegishli boʻlimlarini parallellashtirish imkonini beradi.

Masiv tillari

[tahrir | manbasini tahrirlash]

Massiv tillarida amallar ham skalerlar, ham massivlar uchun amal qilish uchun umumlashtiriladi. Shunday qilib, a+b, agar a va b skalar boʻlsa, ikkita skalar yigʻindisini, agar ular massiv boʻlsa, ikkita massiv yigʻindisini ifodalaydi.

Massiv tili dasturlashni soddalashtiradi, lekin bu xarajat abstraksiya jazosi deb nomlanishi mumkin.[3][4][5] Qoʻshimchalar kodlashning qolgan qismidan ajratilgan holda amalga oshirilganligi sababli, ular eng optimal samarali kodni yaratmasligi mumkin. (Masalan, bir xil massivning boshqa elementlarining qoʻshilishi keyinchalik bir xil bajarilish jarayonida yuz berishi mumkin, bu esa keraksiz takroriy qidiruvlarga sabab boʻlishi mumkin.) Hatto eng murakkab optimallashtiruvchi kompilyator ham ikki yoki undan koʻp bir-biridan farq qiladigan funksiyalarni birlashtirishda juda qiyin boʻladi. Dasturchi buni osonlikcha bajarishi mumkin boʻlsa-da, ular turli xil dastur boʻlimlarida yoki quyi dasturlarda paydo boʻlishi mumkin qoʻshimcha xarajatlarni kamaytirish uchun massivdan bir xil oʻtishdagi summalar.

Oldingi C kodi Ada tilida quyidagiga aylanadi,[6] massiv-dasturlash sintaksisini qoʻllab-quvvatlaydi.

A := A + B;

APL sintaktik shakarsiz bir belgili Unicode belgilaridan foydalanadi.

A  A + B

Ushbu operatsiya istalgan darajadagi massivlarda (shu jumladan 0 darajali) va skaler va massivda ishlaydi. Dyalog APL asl tilni kengaytirilgan topshiriqlar bilan kengaytiradi:

A + B

Analytica Ada bilan bir xil ifoda iqtisodiyotini taʼminlaydi.

A := A + B;

Dartmouth BASIC uchinchi nashrida (1966) matritsa va massivlarni manipulyatsiya qilish uchun MAT bayonotlariga ega edi.

DIM A(4),B(4),C(4)
MAT A = 1
MAT B = 2 * A
MAT C = A + B
MAT PRINT A, B, C

Stata ning matritsali dasturlash tili Mata massiv dasturlashni qoʻllab-quvvatlaydi. Quyida biz qoʻshish, koʻpaytirish, matritsa va skalerni qoʻshish, elementlarni elementlar boʻyicha koʻpaytirish, obuna boʻlish va Mataning koʻp teskari matritsa funksiyalaridan birini tasvirlaymiz.

. mata:

: A = (1,2,3) \(4,5,6)

: A
1 2 3
±------------+
1 | 1 2 3 |
2 | 4 5 6 |
±------------+

: B = (2..4) \(1..3)

: B
1 2 3
±------------+
1 | 2 3 4 |
2 | 1 2 3 |
±------------+

: C = J(3,2,1) // A 3 ga 2 birlik matritsasi

: C
1 2
±--------+
1 | 1 1 |
2 | 1 1 |
3 | 1 1 |
±--------+

: D = A + B

: D
1 2 3
±------------+
1 | 3 5 7 |
2 | 5 7 9 |
±------------+

: E = A*C

: E
1 2
±----------+
1 | 6 6 |
2 | 15 15 |
±----------+

: F = A:*B

: F
1 2 3
±---------------+
1 | 2 6 12 |
2 | 4 10 18 |
±---------------+

: G = E :+ 3

: G
1 2
±----------+
1 | 9 9 |
2 | 18 18 |
±----------+

: H = F[(2\1), (1, 2)] // F va submatritsasini olish uchun obuna

: // 1 va 2 qatorlarni almashtiring
: H
1 2
±----------+
1 | 4 10 |
2 | 2 6 |
±----------+

: I = invsym(F'*F) // a ning umumlashtirilgan teskari (F*F^(-1)F=F)

: // simmetrik musbat yarim aniq matritsa
: I
[simmetrik]
1 2 3
±---------------------------------------------------+
1 | 0 |
2 | 0 3.25 |
3 | 01,75 .9444444444 |
±---------------------------------------------------+

: oxiri

MATLAB da amalga oshirish Fortran tilidan foydalanishga ruxsat berilgan bir xil iqtisodga imkon beradi.

A = A + B;

MATLAB tilining varianti GNU Octave tili boʻlib, u asl tilni kengaytirilgan topshiriqlar bilan kengaytiradi:

A += B;

MATLAB ham, GNU Octave ham tabiiy ravishda chiziqli algebra matritsalarni koʻpaytirish, matritsani inversiya va chiziqli tenglamalar tizimi ning raqamli yechimi kabi amallarni qoʻllab-quvvatlaydi, hatto [[Mur-Penrose psevdoteskari] yordamida ham. ].[7][8]

Ikki massivning ichki mahsulotining Nial misoli mahalliy matritsani koʻpaytirish operatori yordamida amalga oshirilishi mumkin. Agar a [1 n] oʻlchamdagi qator vektori boʻlsa va b [n 1] oʻlchamdagi mos ustun vektori boʻlsa.

a * b;

Aksincha, entrywise mahsulot quyidagicha amalga oshiriladi:

a .* b;

Elementlar soni bir xil boʻlgan ikkita matritsa orasidagi ichki mahsulot berilgan matritsani ustun vektoriga oʻzgartiruvchi yordamchi operator (:) va transpose operatori ':

A(:)' * B(:);

rasdaman soʻrovlar tili maʼlumotlar bazasiga yoʻnaltirilgan massiv dasturlash tilidir. Misol uchun, quyidagi soʻrov bilan ikkita massiv qoʻshilishi mumkin:

A + B ni tanlang
A, B dan

R tili sukut boʻyicha massiv paradigmasi ni qoʻllab-quvvatlaydi. Quyidagi misolda ikkita matritsani koʻpaytirish jarayoni, soʻngra skaler (aslida bir elementli vektor) va vektor qoʻshilishi koʻrsatilgan:

> A <- matritsa(1:6, nrow=2) # !!bu nrow=2 ... va A 2 qatorga ega
> A
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> B <- t( matritsa(6:1, nrow=2) ) # t() koʻchirish operatori !!bu nrow=2 ... va B 3 qatorga ega --- taʼrifiga aniq ziddiyat. A
> B
[,1] [,2]
[1,] 6 5
[2,] 4 3
[3,] 2 1
> C <- A %*% B
> C
[,1] [,2]
[1,] 28 19
[2,] 40 28
> D <- C + 1
> D
[,1] [,2]
[1,] 29 20
[2,] 41 29
> D + c(1, 1) # c() vektor hosil qiladi
[,1] [,2]
[1,] 30 21
[2,] 42 30

Raku massiv paradigmasini Metaoperatorlari orqali qoʻllab-quvvatlaydi.[9] Quyidagi misolda ortiqcha operatori bilan birgalikda Hyper-operator yordamida @a va @b massivlarining qoʻshilishi koʻrsatilgan.

[0] > mening @a = [[1,1],[2,2],[3,3]];
[[1 1] [2 2] [3 3]]

[1] > mening @b = [[4,4],[5,5],[6,6]];
[[4 4] [5 5] [6 6]]

[2] > @a „+“ @b;
[[5 5] [7 7] [9 9]]

Matematik fikrlash va til belgilari

[tahrir | manbasini tahrirlash]

Matritsani chapga boʻlish operatori matritsalarning ayrim semantik xususiyatlarini qisqacha ifodalaydi. Skayar ekvivalentda boʻlgani kabi, agar (matritsaning) (determinant) koeffitsienti A nol boʻlmasa, A * x = (vektorial) tenglamani yechish mumkin. b, ikkala tomonni A ning teskari ga chapga koʻpaytirish orqali: A−1 (MATLAB va GNU oktava tillarida: A^-1). Quyidagi matematik bayonotlar A toʻliq daraja kvadrat matritsa boʻlganda amal qiladi:

A^-1 *(A * x)==A^-1 * (b)
(A^-1 * A)* x ==A^-1 * b       (matritsa-koʻpaytirish assotsiativlik)
x = A^-1 * b

bu yerda == – ekvivalentlik aloqa operatori. Oldingi bayonotlar, agar uchinchisi boshqalardan oldin bajarilgan boʻlsa, MATLAB iboralari ham haqiqiydir (raqamli taqqoslashlar yaxlitlash xatolari tufayli notoʻgʻri boʻlishi mumkin).

Agar tizim haddan tashqari aniqlangan boʻlsa – A ustunlardan koʻra koʻproq satrlarga ega boʻlsa – pseudoinverse A+ (MATLAB va GNU oktava tillarida: <kod) >pinv(A)) teskari A−1 oʻrnini quyidagi tarzda oʻzgartirishi mumkin:

pinv(A) *(A * x)==pinv(A) * (b)
(pinv(A) * A)* x ==pinv(A) * b       (matritsani koʻpaytirish assotsiativligi)
x = pinv(A) * b

Biroq, bu yechimlar eng ixcham (masalan, haddan tashqari aniqlangan tizimlarni notasion ravishda farqlash zarurati saqlanib qolmoqda) ham, hisoblash jihatidan eng samarali ham emas. a * x = b skaler ekvivalentini qayta koʻrib chiqishda oxirgi nuqtani tushunish oson, buning uchun x = a^-1 * b yechimi ikkita amalni talab qiladi. samaraliroq x = b / a. Muammo shundaki, odatda matritsalarni koʻpaytirish kommutativ emas, chunki skalyar yechimning matritsa holatiga kengayishi quyidagilarni talab qiladi:

(a * x)/ a ==b / a
(x * a)/ a ==b / a       (matritsalar uchun kommutativlik amal qilmaydi!)
x * (a / a)==b / a       (assotsiativlik matritsalar uchun ham amal qiladi)
x = b / a

MATLAB tili skaler holat bilan oʻxshashlikning muhim qismini saqlab qolish uchun chapga boʻlinish operatorini \ bilan tanishtiradi, shuning uchun matematik fikrlashni soddalashtiradi va ixchamlikni saqlaydi:

A \ (A * x)==A \ b
(A \ A)* x ==A \ b       (assotsiativlik matritsalar uchun ham amal qiladi, kommutativlik endi talab qilinmaydi)
x = A \ b

Bu nafaqat kodlash nuqtai nazaridan, balki hisoblash samaradorligi nuqtai nazaridan ham qisqa massiv dasturlashning namunasidir, bir nechta massiv dasturlash tillarida ATLAS kabi juda samarali chiziqli algebra kutubxonalaridan foyda koʻradi. yoki LAPACK.[10]

Iversonning oldingi iqtibosiga qaytadigan boʻlsak, uning mantiqiy asosi endi aniq boʻlishi kerak:

Nota yozuvini tasvirlash va o'rganish qiyinligini uning oqibatlarini o'zlashtirish qiyinligidan farqlash muhim. Masalan, matritsa mahsulotini hisoblash qoidalarini o‘rganish oson, lekin uning ta’sirini o‘zlashtirish (masalan, uning assotsiativligi, qo‘shish bo‘yicha taqsimlanishi, chiziqli funksiyalar va geometrik amallarni ifodalash qobiliyati) boshqa va ancha murakkab masala. . Haqiqatan ham, yozuvning o'ziga xosligi, tadqiqot uchun taklif qiladigan ko'plab xususiyatlar tufayli uni o'rganishni qiyinlashtirishi mumkin.

Uchinchi tomon kutubxonalari

[tahrir | manbasini tahrirlash]

Aniqroq abstraksiyalarni taqdim qilish uchun maxsus va samarali kutubxonalardan foydalanish boshqa dasturlash tillarida ham keng tarqalgan. C++da bir nechta chiziqli algebra kutubxonalari tilning operatorlarni ortiqcha yuklash imkoniyatlaridan foydalanadi. Baʼzi hollarda bu tillardagi juda qisqa abstraksiyaga massiv dasturlash paradigmasi aniq taʼsir qiladi, chunki NumPy kengaytma kutubxonasi Python, Armadillo. va Blitz++ kutubxonalari ishlaydi.[11][12]

Shuningdek qarang

[tahrir | manbasini tahrirlash]

Ma'lumotnomalar

[tahrir | manbasini tahrirlash]
  1. NumPy massivi: samarali sonli hisoblash tuzilmasi. doi:10.1109/mcse.2011.37. 
  2. Andoza:Jurnaldan iqtibos
  3. Surana P (2006). Til abstraktsiyalarining meta-kompilyatsiyasi (Thesis).
  4. , arxivsana= parametri ham koʻrsatilishi zarur. „Ma'lumotlarni abstraktsiya qilish jazosi (DAP) ) Java-da kichik ob'ektlar uchun benchmark.“. Qaraldi: 2008-yil 17-mart.
  5. Andoza:Kitobdan iqtibos keltiring
  6. Ada Reference Manual: G.3.1 Haqiqiy vektorlar va Matritsalar
  7. „GNU oktava qo‘llanmasi. Arifmetik operatorlar.“. Qaraldi: 2011-yil 19-mart.
  8. Andoza:Vebdan iqtibos
  9. „Raku Operator hujjatlarining Metaoperatorlar bo‘limi“.
  10. „GNU Octave Manual. Ilova G Oktavani o'rnatish.“. Qaraldi: 2011-yil 19-mart.
  11. „Malumot uchun Armadillo 1.1.8. Matlab/Oktava sintaksisi va kontseptual jihatdan mos keladigan Armadillo sintaksisiga misollar.“. Qaraldi: 2011-yil 19-mart.
  12. {{cite web |title= Blitz++ Foydalanuvchi uchun qo‘llanma. 3. Massiv ifodalari. |url= http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |access-date= 2011-03-19 |arxiv-url= https://web.archive.org/web/20110323013142/http://www.oonumerics.org/blitz/docs/blitz_3.html#SEC80 |archive-date= 23-03-2011 |url-status= o'lik } }

Tashqi havolalar

[tahrir | manbasini tahrirlash]

Andoza:Dasturlash paradigmalari navbox Andoza:Dasturlash tillarining turlari