Մաթլաբ

**Մաթլաբ** (), ՄաթՎորքսի կողմից մշակված թվային հաշվողական միջավայր և ծրագրավորման լեզու։ Մաթլաբը թույլ է տալիս իրականացնել մատրիցային մանիպուլյացիաներ, ֆունկցիաների և տվյալների գրաֆիկների կառուցում, ալգորիթմների իրականացում, օգտատերերի անհատական ինտերֆեյսների ստեղծում և այլ լեզուներով գրված ծրագրերի փոխազդեցություն։

Չնայած Մաթլաբը հիմնականում նախատեսված է թվային հաշվարկների համար, սակայն լրացուցիչ գործիքների հավաքածուն  օգտագործում է ՄաՓադ շարժիչ, որը թույլ է տալիս օգտագործել սիմվոլիկ հաշվողական նոր ունակություններ։ Սիմուլինկի լրացուցիչ փաթեթը դինամիկ և ներդրված համակարգերի համար ավելացնում է գրաֆիկական բազմաբնույթ տիրույթների մոդելավորում, ինչպես նաև այդ մոդելի վրա հիմնված դիզայն։

2020 թվականի դրությամբ, Մաթլաբն ունի ավելի քան 4 միլիոն օգտագործող ամբողջ աշխարհում։ Մաթլաբի հիմնական օգտագործողներ են համարվում ճարտարագիտության, գիտության և տնտեսագիտության ոլորտի ներկայացուցիչները։

## Պատմություն
Նյու Մեքսիկոյի համալսարանի համակարգչային գիտությունների ամբիոնի վարիչ Քլիվ Մոլերը սկսեց զարգացնել Մաթլաբը 1970-ականների վերջին։ Նա մշակեց այն, որպեսզի ուսանողներին հնարավորություն ընձեռի օգտվել Լինփաքից և Էիսփաքից` առանց Ֆորտրան սովորելու։ Շուտով այն տարածվեց նաև այլ համալսարաններում և ուժեղ լսարան գտավ  կիրառական մաթեմատիկայի համայնքում։ Ինժեներ Ջեք Լիթլը, առաջին անգամ բախվել է Մաթլաբի հետ 1983 թվականին Սթենֆորդի համալսարանում Մոլերի հետ այցի ժամանակ։ Գիտակցելով նրա կոմերցիոն ներուժը ՝ նա միավորվեց Մոլերի և Սթիվ Բանգերտի հետ։ Նրանք վերաշարադրել են Մաթլաբը C-ում և 1984-ին հիմնել ՄաթՎորքսը `շարունակելու դրա զարգացումը։  2000 թ.-ին Մաթլաբը վերագրվեց`գրադարանների նոր հավաքածու օգտագործելու համար` մատրիցային մանիպուլյացիաների համար։

Մաթլաբն առաջին անգամ ընդունվել է հետազոտողների և մասնագետների կողմից՝ ինժեներության մեջ, բայց արագորեն տարածվել է շատ այլ ոլորտներում։ Ներկայումս այն նաև օգտագործվում է կրթության մեջ, մասնավորապես գծային հանրահաշվի ուսուցման և թվային վերլուծության մեջ և հանրաճանաչ է պատկերների մշակմամբ զբաղվող գիտնականների շրջանում։

## Շարահյուսություն
Մաթլաբ հավելվածը գրված է Մաթլաբ ծրագրավորման լեզվով։ Մաթլաբ հավելվածի ընդհանուր օգտագործումը ներառում է «հրամանի պատուհան»-ի օգտագործում որպես ինտերակտիվ մաթեմատիկական վահանակ կամ Մաթլաբի ծածկագիր պարունակող տեքստային ֆայլերի իրականացում։

### Փոփոխականներ
Փոփոխականները սահմանվում են հավասարման օպերատորի միջոցով՝ `=`։ Մաթլաբը թույլ տիպացված ծրագրավորման լեզու է, քանի որ տիպերը անուղղակիորեն փոխակերպվում են։ Սա ենթադրում է թույլ տիպացված լեզու, քանի որ փոփոխականները կարող են նշանակվել`առանց դրանց տիպը հայտարարելու, բացառությամբ այն դեպքերի, երբ դրանք պետք է դիտվեն որպես սիմվոլիկ օբյեկտներ, և որ նրանց տեսակը կարող է փոխվել։ Արժեքները կարող են առաջանալ կոնստանտներից, այլ փոփոխականների արժեքների հաշվարկից կամ ֆունկցիաների արդյունքից։ Օրինակ՝  
```matlabsession
>> x = 17
x =
 17

>> x = 'hat'
x =
hat

>> x = [3*4, pi/2]
x =
   12.0000    1.5708

>> y = 3*sin(x)
y =
   -1.6097    3.0000
```


### Վեկտորներ և մատրիցներ
Սովորական զանգվածը սահմանվում է՝ օգտագործելով երկու կետերի կառուցվածքը՝ սկիզբ՝ `:`*աճ՝*`:`*ավարտ*. Օրինակ՝
```matlab
>> array = 1:2:9
array =
 1 3 5 7 9
```

վերևում սահմանված է մի փոփոխական՝  `array`  անունով (կամ վերագրված է նոր արժեք արդեն գոյություն ունեցող փոփոխականի՝ `array`անունով), որը զանգված է՝ կազմված 1, 3, 5, 7 և 9 արժեքներից։

Այսինքն, զանգվածը սկսվում է 1-ից (նախնական արժեքը), հետո յուրաքանչյուր քայլով ավելանում է 2-ով (աճի արժեքը) և կանգ է առնում, երբ այն հասնում է 9-ի (վերջին արժեքը)։

```matlab
>> array = 1:3:9
array =
 1 4 7
```

աճի արժեքը, ըստ էության, կարող է դուրս մնալ այս շարահյուսությունից (երկու կետերից մեկի հետ միասին) օգտագործելով 1-նախնական արժեքը։

```matlab
>> ari = 1:5
ari =
 1 2 3 4 5
```

`ari` անունով զանգվածին վերագրված է 1, 2, 3, 4 և 5 թվային արժեքներ, և քանի որ աճի արժեք չկա, այն ավելանում է 1-ով։

Ինդեքսավորումը 1-ից է սկսում, ինչը սովորական է մաթեմատիկական մատրիցների համար, ի տարբերություն զրոյի վրա հիմնված ինդեքսավորման, որը սովորաբար օգտագործվում է այլ հայտնի ծրագրավորման լեզուներում, ինչպիսիք են C, C ++ և Ջավա։

Մատրիցաները կարող են սահմանվել տողի տարրերը դատարկ տարածության կամ ստորակետով բաժանելու միջոցով և յուրաքանչյուր շարքի ավարտի համար կետ-ստորակետ օգտագործելով։ Էլեմենտների ցանկը պետք է քառակուսի փակագծերի մեջ լինի `[]`։ Փակագծերը `()` օգտագործվում են էլեմենտներին մուտք ունենալու և հետո դրանցով աշխատելու համար (նաև ֆունկցիաներում են հանդիպում)։


```matlab
>> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
A =
 16  3  2 13
  5 10 11  8
  9  6  7 12
  4 15 14  1

>> A(2,3)
ans =
 11
```


Ինդեքսների հավաքածուները կարող են սահմանվել `2:4`տիպի արտահայտություններով, որոնք գնահատվում են `[2, 3, 4]։`

Օրինակ, 2-ից 4-րդ տողերից և 3-ից 4-րդ սյուներից կազմված ենթամատրիցան կարելի է գրել հետևյալ կերպ՝

```matlab
>> A(2:4,3:4)
ans =
 11 8
 7 12
 14 1
```

N չափի քառակուսի մատրից կարող է ստեղծվել `eye`ֆունկցիայի միջոցով, և ցանկացած չափի մատրիցներ, որոնք կազմված են զրոներից կամ մեկերից կարող են ստեղծվել `zeros` և `ones` ֆունկցիաների միջոցով, համապատասխանաբար՝

```matlab
>> eye(3,3)
ans =
 1 0 0
 0 1 0
 0 0 1

>> zeros(2,3)
ans =
 0 0 0
 0 0 0

>> ones(2,3)
ans =
 1 1 1
 1 1 1
```


Վեկտոր կամ մատրիցա տեղափոխելը կատարվում է կա՛մ `transpose` ֆունկցիայով, կա՛մ մատրիցից հետո կետ-շտրիխ ավելացնելով (առանց կետի, շտրիխը կկատարի բարդ զանգվածների փոխկապակցված փոխադրում).

```matlab
>> A = [1 ; 2],  B = A.', C = transpose(A)
A =
     1
     2
B =
     1     2
C =
     1     2

>> D = [0 3 ; 1 5], D.'
D =
     0     3
     1     5
ans =
     0     1
     3     5
```


Ֆունկցիաներից շատերն ընդունում են զանգվածներ որպես մուտքային տվյալներ և գործողություններ են կատարում յուրաքանչյուր տարրի հետ առանձին-առանձին։ Օրինակ, `mod(2*J,n)` բազմապատկում է J- ի յուրաքանչյուր տարր 2-ով, այնուհետև յուրաքանչյուր տարրը նվազեցնում է n մոդուլով։ Մաթլաբը ներառում է ստանդարտ `for` և `while` ցիկլեր, բայց (ինչպես R- ի նման այլ ծրագրերում), վեկտորիզացված նոտայի օգտագործումը ևս խրախուսվում է և հաճախ ավելի արագ է իրականացվում։ Հետևյալ կոդը, ստացված *magic.m* ֆունկցիայից, *n* -ի կենտ արժեքների համար ստեղծում է մեջիք քառակուսի M (Մաթլաբի `meshgrid` ֆունկցիան օգտագործվում է այստեղ՝ *1:n* պարունակող *I*  և *J*  քառակուսի մատրիցներ ստեղծելու համար).


```matlab
[J,I] = meshgrid(1:n);
A = mod(I + J - (n + 3) / 2, n);
B = mod(I + 2 * J - 2, n);
M = n * A + B + 1;
```


### Կառուցվածք
Մաթլաբն աջակցում է կառուցվածքի տվյալների տիպերին։ Քանի որ Մաթլաբի բոլոր փոփոխականները զանգվածներ են, ավելի համարժեք անուն է «կառուցվածքային զանգված», որտեղ զանգվածի յուրաքանչյուր տարր ունի նույն դաշտային անունները։ Բացի այդ, Մաթլաբն աջակցում է դինամիկ դաշտային անվանումներին (դաշտի որոնումներին անունով, դաշտերի մանիպուլյացիաներով և այլն)։

### Ֆունկցիաներ
Մաթլաբի ֆունկցիա ստեղծելիս ֆայլի անունը պետք է համապատասխանի ֆայլում առաջին ֆունկցիայի անվանմանը։ Ֆունկցիայի թույլատրելի անունները կարող են պարունակել տառեր, թվեր կամ ընդգծման նշաններ։ Փոփոխականները և ֆունկցիաները զգայուն են նիշերի ռեգիստրի նկատմամբ։

### Ֆունկցիայի նկարագրություն
Մաթլաբն աջակցում է լամբդա հաշվարկային տարրերին` ներկայացնելով ֆունկցիայի նկարագրություն, կամ ֆունկցիայի մասին ծանոթագրություններ, որոնք իրականացվում են կա՛մ .m ֆայլերում, կա՛մ անանուն/ ներդրված ֆունկցիաներում։

### Կլասսներ և օբյեկտի վրա հիմնված ծրագրավորման լեզու
Մաթլաբն աջակցում է օբյեկտի վրա հիմնված ծրագրավորմանը` ներառյալ կլասսերը, ժառանգությունը, վիրտուալ ուղարկումը, փաթեթները, անցումային արժեքի իմաստաբանությունը և անցումային նշման իմաստաբանությունը։ Այնուամենայնիվ, շարահյուսությունը և տարրերի կանչերը զգալիորեն տարբերվում են այլ լեզուներից։ Մաթլաբն ունի ինչպես արժեքների կլասսներ, այնպես էլ հղումների կլասսներ, կախված նրանից, թե արդյոք կլասսի նկարագրությունը որպես սուպեր կլասս է (հղման կլասսերի համար), թե` ոչ (արժեքների կլասսերի համար)։

Մեթոդի կանչելը տարբերվում է արժեքի և հղման կլասսերից։ Մեթոդի կանչի օրինակ՝
```matlab
object.method();
```

Այն կարող է փոխել օբյեկտի ցանկացած անդամ միայն այն դեպքում, եթե օբյեկտը հանդիսանում է հղման կլասսի օրինակ, այլապես արժեքի կլասսի մեթոդները պետք է վերադարձնեն նոր օրինակ, եթե անհրաժեշտ է փոփոխել օբյեկտը։

Ստորև բերված է պարզ կլասսի օրինակ՝


```matlab
classdef Hello
    methods
        function greet(obj)
            disp('Hello!')
        end
    end
end
```


Hello.m անունով ֆայլի մեջ դնելիս դա կարող է իրականացվել հետևյալ հրամաններով.

```matlabsession
>> x = Hello();
>> x.greet();
Hello!
```


## Գրաֆիկներ և գրաֆիկական ինտերֆեյսի ծրագրավորում
* {
	"version": 2,
	"width": 400,
	"height": 200,
	"data": [
		{
			"name": "table",
			"values": [
				{
					"x": 3,
					"y": 1
				},
				{
					"x": 1,
					"y": 3
				},
				{
					"x": 2,
					"y": 2
				},
				{
					"x": 3,
					"y": 4
				}
			]
		}
	],
	"scales": [
		{
			"name": "x",
			"type": "ordinal",
			"range": "width",
			"zero": false,
			"domain": {
				"data": "table",
				"field": "x"
			}
		},
		{
			"name": "y",
			"type": "linear",
			"range": "height",
			"nice": true,
			"domain": {
				"data": "table",
				"field": "y"
			}
		}
	],
	"axes": [
		{
			"type": "x",
			"scale": "x"
		},
		{
			"type": "y",
			"scale": "y"
		}
	],
	"marks": [
		{
			"type": "rect",
			"from": {
				"data": "table"
			},
			"properties": {
				"enter": {
					"x": {
						"scale": "x",
						"field": "x"
					},
					"y": {
						"scale": "y",
						"field": "y"
					},
					"y2": {
						"scale": "y",
						"value": 0
					},
					"fill": {
						"value": "steelblue"
					},
					"width": {
						"scale": "x",
						"band": "true",
						"offset": -1
					}
				}
			}
		}
	]
}

Մաթլաբը սերտորեն ինտեգրված է գրաֆիկային-գծապատկերային հատկանիշներով։

Օրինակ, *plot* ֆունկցիան կարող է օգտագործվել երկու x և y վեկտորներից գրաֆիկ ստեղծելու համար։ Կոդը՝

```matlab
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
```

Սա ստեղծում է սինուս ֆունկցիայի հետևյալ ցուցանիշը.

350px

Մաթլաբն  աջակցում է նաև եռաչափ գրաֆիկայի ՝

Մաթլաբն աջակցում է նաև գրաֆիկական ինտերֆեյսի (GUI)։

Ինտերֆեյս կարող է ստեղծվել ծրագրային կոդի միջոցով կամ վիրտուալ դիզայնի միջավայրում, ինչպիսիք են *GUIDE* և *App Designer միջավայրերը*։

## Ինտերֆեյս այլ լեզուների հետ
Մաթլաբը կարող է կանչել C կամ Ֆորտրան ծրագրավորման լեզուներով գրված ֆունկցիաներ։ Ստեղծվում է ֆունկցիա-վահանակ, որը թույլ է տալիս փոխանցել և վերադարձնել Մաթլաբի տվյալների տեսակները։ MEX-ֆայլերը (գործարկվող Մաթլաբ ֆայլեր) դինամիկ կերպով վերբեռնված օբյեկտ ֆայլեր են, որոնք ստեղծվել են նման ֆունկցիաների կազմման միջոցով։  2014 թվականից ավելացավ երկկողմանի ինտերֆեյս Փայթոնի հետ։

Perl-ի, Ջավայյի, ԷքթիվԻքս-ի կամ .Նեթ-ի վրա գրված գրադարանները կարող են ուղղակիորեն կանչվել Մաթլաբից, և շատ Մաթլաբ գրադարաններ (օրինակ XML կամ SQL), օգտագործվում են Ջավայի կամ ԷքթիվԻքս-ի գրադարանների շուրջ։ Մաթլաբից Ջավա կանչելն ավելի բարդ է, բայց կարող է կատարվել Մաթլաբի գործիքների հավաքածուով, որը վաճառվում է առանձին ՄաթՎորքսով կամ jmi-իի (Ջավա-Մաթլաբ ինտերֆեյս) մեխանիզմով (որը չպետք է շփոթել Ջավայի մետատվյալների ոչ կապակցված ինտերֆեյսի հետ, որը ևս կոչվում է JMI): Ջավայի համար պաշտոնական Մաթլաբի API- ն ավելացվել է 2016 թվականին։

Որպես այլընտրանք Մաթվորքսում հասանելի ՄաՓադ շարժիչի վրա հիմնված սիմվոլիկ մաթեմատիկայի գործիքիով Մաթլաբը կարող է միացված լինել Մափըլին։

Գրադարաններ կան նաև ՄաթՄԼ ներմուծելու և արտահանելու համար։

## Չինաստանի արգելքը
2020 թվականին չինական պետական ԶԼՄ-ները հայտնում են, որ Մաթլաբը ԱՄՆ պատժամիջոցներով չեղարկել է Չինաստանի երկու համալսարանների ծառայություններ, և Չինաստանը հայտարարել է, որ դրան կպատասխանեն բաց աղբյուրների այլընտրանքների օգտագործմամբ և ներքին այլընտրանքների զարգացմամբ։

## Այլընտրանքներ
Մաթլաբին մի շարք մրցակիցներ կան։ Որոշ ուշագրավ օրինակներ են.

*Մափըլ
*ԻԴԼ
*Վոլֆրամ Մաթեմատիկա։

Մաթլաբի համար կան նաև անվճար բաց կոդով այլընտրանքներ, մասնավորապես.

* ԳՆՈՒ Օքթավ
* Սքիլաբ
* ՖրիՄաթ
* Ջուլիա
* ՍեյջՄաթ

որոնք որոշ չափով համատեղելի են Մաթլաբ լեզվի հետ։ ԳՆՈՒ Օքթավն առանձնահատուկ է մյուսներից, քանի որ այն նպատակ ունի զուգակցվել Մաթլաբի շարահյուսության հետ։

Կան նաև գրադարաններ, որոնք գոյություն ունեցող լեզուներին նման ֆունկցիոնալություն են ավելացնում, ինչպիսիք են.

* ՆամՓայ/ՍքիՓայ/մաթփլոթլիբ Փայթոնի համար
* Perl Տվյալների լեզու Perl-ի համար  
* ՍքիՌուբի Ruby-ի համար
*IT++ C++-ի համար 
* Նյումերիք.ջէյես  Ջավասկրիպտ-ի  համար։

## Թողարկման պատմություն

Մաթլաբի և իր պաշտոնական գործիքատուփերի փոփոխությունների ամբողջական ցուցակի համար կարդացեք Մաթլաբի թողարկման պատմություն աղյուսակի գրառումներ դաշտը։

## Ծանոթագրություններ

## Արտաքին հղումներ

* 
* 
* 
* 

Կատեգորիա:Ծրագրավորման լեզուներ
Կատեգորիա:Ծրագրավորում