Кіріспе
Компьютерлік жадыдағы массивті бейнелеу
Есептеу техникасында, жол бойынша реттеу және баған бойынша реттеу – бұл кездейсоқ кіру жадысы сияқты сызықтық сақтауда көп өлшемді массивтерді сақтау әдістері. Реттеулердің арасындағы айырмашылық массив элементтерінің жадыда қалай тікелей орналасқандығында. Жол бойынша реттеуде, қатардағы тікелей элементтер бір-біріне жақын орналасады, ал баған бойынша реттеуде де бағандағы тікелей элементтер үшін осыған ұқсас жағдай орын алады. Бұл терминдер екі өлшемді массивтің, яғни матрицаның қатарлары мен бағаналарына сілтеме берсе де, реттеулерді кез келген өлшемдегі массивтерге жалпылауға болады, өйткені жол бойынша және баған бойынша реттеу терминдері лексикографиялық және колексикографиялық реттеулерге сәйкес келеді. Матрицалар көбінесе қатар немесе баған векторларының жиынтығы ретінде бейнеленетінін және осы тәсілді қолдану арқылы тиімді түрде тікелей векторлар немесе тікелей вектор компоненттері ретінде сақталады екенін атап өту маңызды. Деректерді сақтаудың мұндай тәсілдері тиісінше AoS (Array of Structures) және SoA (Structure of Arrays) деп аталады. Әр түрлі бағдарламалау тілдерінде жазылған бағдарламалар арасында массивтерді дұрыс беру үшін деректердің орналасуы маңызды. Массивті қарап шығу кезінде де бұл өнімділік үшін маңызды, өйткені қазіргі заманғы процессорлар тікелей деректерді тікелей емес деректерге қарағанда тиімдірек өңдейді. Бұл негізінен процессордың кэшіне байланысты, ол деректердің кеңістіктік жақындығын пайдаланады. Сонымен қатар, тікелей кіру деректердің векторларында жұмыс істейтін SIMD нұсқауларын пайдалануға мүмкіндік береді. Магниттік таспадағы деректерді сақтау сияқты кейбір жағдайларда, тікелей кіру тікелей емес кіруден әлдеқайда жылдам болады.
Бағдарламалау тілдері мен кітапханалар
Көп өлшемді массивтерді қолдайтын бағдарламалау тілдері немесе олардың стандартты кітапханалары әдетте осы массивтерді сақтау үшін қатар бойынша немесе баған бойынша тәртіпті пайдаланады. Қатар бойынша тәртіп C/C++/Objective C (C стиліндегі массивлер үшін), PL/I, Pascal, Speakeasy және SAS тілдерінде қолданылады. Баған бойынша тәртіп Fortran, MATLAB, GNU Octave, Julia, S, S PLUS, R, Scilab, Yorick және Rasdaman тілдерінде қолданылады.
Не басты жол, не басты баған
Тығыз массивті сақтаудың кең таралған баламасы – Iliffe векторларын пайдалану. Олар әдетте бір қатардағы элементтерге сілтемелерді тізбектей сақтайды (қатар бойынша орналасу тәртібі сияқты), бірақ қатарлардың өзін емес. Олар (жасы бойынша реттелген): Java, C#/CLI/.Net, Scala және Swift тілдерінде қолданылады. Одан да сирек кездесетін тәсіл – тізімдердің тізімдерін пайдалану, мысалы, Python және Wolfram Mathematica-ның Wolfram тілінде. Тағы бір балама – кестелердің кестелерін пайдалану, мысалы, Lua тілінде.
Сыртқы кітапханалар
Көп өлшемді массивтерді қолдауды сыртқы кітапханалар да қамтамасыз ете алады, тіпті олар кездейсоқ реттелуді де қолдайды, онда әрбір өлшемнің қадамдық мәні болады, ал қатарлық негізгі немесе бағандық негізгі – екі ғана мүмкін түсіндіру. NumPy (Python үшін) бойынша қатарлық рет әдепкі болып табылады. Eigen және Armadillo (C++ үшін) бойынша бағандық рет әдепкі болып табылады. Графикалық өңдеу үшін OpenGL (және OpenGL ES) ерекше жағдай болып табылады. «Сызықтық алгебра және оған байланысты салалардың қазіргі математикалық қарастыруларында векторлар әдетте бағандар ретінде қарастырылады», – деген себеппен дизайнер Марк Сегал бұрынғы IRIS GL-дегі конвенцияны, яғни векторларды қатарлар түрінде жазуды өзгертуге шешім қабылдады; үйлесімділік үшін түрлендіру матрицалары әлі де векторлық бас (= қатарлық бас) ретінде сақталады, координаталық бас (= бағандық бас) ретінде емес, содан кейін ол «OpenGL-дегі матрицалар бағандық бас ретінде сақталады» деген тәсілді қолданды. Бұл көбінесе көрсету үшін ғана маңызды болды, себебі матрицалық көбейту стекке негізделген және оны көбейтуден кейін деп түсіндіруге болатын, бірақ одан да нашар, шындық C-тіліндегі API арқылы шығып кетті, өйткені жеке элементтерге M[вектор][координата] немесе, тиімді түрде, M[баған][қатар] арқылы қол жеткізіледі, бұл дизайнер қабылдауға тырысқан конвенцияны бұзады, және бұл тіпті кейінірек қосылған OpenGL Shading Language-те де сақталды (бірақ бұл координаттарды атау арқылы да қол жеткізуге мүмкіндік береді, мысалы, M[вектор].y). Нәтижесінде, көптеген әзірлеушілер енді бағанды бірінші индекс ретінде бағандық бас ретінің анықтамасы деп қарастырады, тіпті бұл Фортран сияқты нақты бағандық бас тілінде емес. Torch (Lua үшін) бағандық бас ретінен қатарлық бас ретіне өзгерді.
Орындау
Массивтің индекстерін ауыстыру массивті транспозициялаудың өзегі болғандықтан, қатар бойынша сақталған, бірақ баған бойынша оқылатын массив (немесе керісінше) транспозицияланған сияқты көрінеді (матрица квадрат болған жағдайда). Мұндай жадыда қайта реттеуді жүзеге асыру әдетте қымбат операция болғандықтан, кейбір жүйелер жеке матрицаларды транспозицияланған күйде сақтауға мүмкіндік береді. Бағдарламашы нақты қолданылуына байланысты (есептеуде массивті қанша рет қайта пайдалануды қоса алғанда) жадыда элементтерді қайта реттеуге болады немесе болмайды деген шешімді қабылдауы керек. Мысалы, негізгі сызықтық алгебраның кіші бағдарламалары функцияларына транспозицияланған массивтерді көрсету үшін флагтар жіберіледі.