跳转到导航跳转以搜索计算,行主要订单和列 - 主要订单是用于在线存储中存储多维阵列的方法,例如随机存取存储器。
订单之间的差异在于,数组的元素在内存中连续。在行主要顺序中,行的连续元素彼此彼此驻留,而相同的是列在列主要订单中的连续元素中的连续元素。虽然术语暗示到二维阵列的行和列,即矩阵,但是订单可以通过注意到术语行 - 主要和列专业等同于词典和追加阶数,但是订单可以推广到任何维度的阵列。分别。
数据布局对于正确地传递以不同编程语言编写的程序之间的阵列至关重要。在遍历阵列时,由于现代CPU更有效地比非顺序数据更有效地进行阵列,它也很重要。这主要是由于CPU缓存,该CPU缓存利用了相应的空间局部。 [1]此外,连续访问使得可以使用在数据向量上运行的SIMD指令。在诸如磁带或NAND闪存之类的一些媒体中,顺序访问是比非顺序访问更快的数量级。 [所需的引用]
术语行主要和列 - 主要茎与订购对象有关的术语。使用许多属性订购对象的一般方法是第一个组,然后按一个属性订购,然后,在每个这样的组中,组并通过另一个属性等命令。如果多于一个属性参与排序,则首先将被称为专业和最后一个未成年人。如果两个属性参与排序,则只有名称只有主要属性就足够了。
在阵列的情况下,属性是每个维度的索引。对于数学符号中的矩阵,第一索引指示该行,第二个索引指示列,例如,给定矩阵A {\ DisplayStyle a},1,2 {\ displaystyle a_ {1,2}}是它的第一个行和第二列。该公约在编程语言中进行到语法,[2]虽然通常以0而不是1. [3]开始索引而不是1. [3]
即使行由第一个索引和第二索引表示第一个索引和列,它也没有暗示尺寸之间的分组顺序。因此,如何通过划线或列主要方法进行组和订购索引,因此是一个惯例。相同的术语可以应用于甚至更高的维数阵列。行主要分组从最右边指数的最左边的指数和列专业开始,分别导致词典和粘性(或Colex)订单。
a = [a 11a 12 a 13a 22a 22a 22a 23] {\ displaystyle a = {\ begin {bmatrix} a_ {11}& a_ {12}& a_ {13} \\ a_ {21}&amp ; a_ {22}& a_ {23} \ end {bmatrix}}}
不同的编程语言以不同的方式处理此方法。在C中,多维阵列以行主要顺序存储,并且数组索引是写入行第一(词典接入顺序):
另一方面,在Fortran中,数组以列 - 主要顺序存储,而数组索引仍然写入行第一(Colexicographic Access Order):
注意如何使用[i] [j]与多步索引,如c中的多步索引,而不是像fortran中的(i,j)这样的中性符号,几乎不可避免地意味着句法原因,所以要说,因为它可以被重写为([i])[j],并且甚至可以将A [i]行部件分配给中间变量,然后在单独的表达式中索引。 (不应假设其他影响,例如,Fortran不仅仅是因为它的符号而不是列,甚至可以用新语言故意规避上述含义。)
要在行主要环境中使用列主要订单,反之亦然,无论如何,一个解决方法是将非传统角色分配给索引(使用列的第一个索引和行的第二个索引),另一个是通过在一维数组中明确计算位置来绕过语言语法。当然,偏离了“公约”可能会产生与传统语言特征和其他代码的必要互动程度增加的成本,不仅以增加漏洞的增加的形式(忘记还反转矩阵乘法顺序,在代码期间恢复惯例)维护等),但也以必须主动重新排列元件的形式,所有这些都必须根据任何原始目的进行称重,例如越来越多的性能。运行循环行,是C的行主要语言,如C的行主要语言是优选的,反之亦为列主要语言。
支持多维阵列的编程语言或其标准库通常具有用于这些数组的本机行 - 主要或列主要存储顺序。
行主要订单用于C / C ++ / Objective-C(对于C型阵列),PL / I,[4] Pascal,[5]宣传,[引用] SAS,[6]和Rasdaman。 [7]
密集阵列存储的典型替代方案是使用ILIFFE矢量,该载体通常连续地存储同一行中的元素(如行主要顺序),但不是行本身。它们用于(按年龄订购):Java,[13] C#/ CLI / .NET,SCALA,[14]和SWIFT。
甚至更少的密度是使用列表,例如,在Python,[15]和Wolfram Mathematica的Wolfram语言中。 [16]
对于多维阵列的支持也可以由外部库提供,其甚至可以支持任意排序,其中每个维度具有步幅值,并且行 - 主要或列 - 主要只是两个可能的结果的解释。
一个特殊情况将是用于图形处理的OpenGL(和OpenGL ES)。自从"最近的线性代数和相关领域的数学处理总是将载体视为列,"设计师Mark Segal决定在前任IRIS GL中替换为“公约”,这是将载体写为行;为了兼容性,转换矩阵仍将存储在Vector-major(=行 - 主要)中而不是坐标 - 主要(=列 - 主要)顺序中,然后他使用诀窍" [to]说OpenGL中的矩阵存储在列主要订单中" [20]这实际上只与演示文稿相关,因为矩阵乘法是基于堆栈的,并且仍然可以被解释为乘法后,但更糟糕的是,由于单个元素将被访问为M [矢量[坐标]或有效地,M [列] [行],这不幸的是,这使得设计师所寻求采用的惯例,并且这甚至在后来添加的OpenGL着色语言中保存(尽管这也可以实现按名称访问坐标,例如,m [向量] .y)。因此,许多开发人员现在将简单地声明将列作为第一个索引的定义是列专业的定义,即使这显然不是像Fortran这样的真实列主要语言的情况。
作为交换阵列的指标是阵列转换的本质,将作为row-mark存储但读取为列 - 主要(或反之亦然)的数组将出现转换。由于在存储器中实际执行该重新排列通常是昂贵的操作,一些系统提供了将单个矩阵指定存储转置的选项。然后,程序员必须根据实际使用(包括阵列在计算中重用的次数)来决定是否重新排列内存中的元素。
例如,基本的线性代数子程序函数是通过指示转置的阵列的标志。 [23]
对于D维N 1×N 2×⋯×n d {\ displaystyle n_ {1} \ times n_ {2} \ times \ cdots \ times n_ {d}} vileions n k(k = 1 .. .D),该阵列的给定元素由元组(n 1,n 2,...,nd)指定{\ displaystyle(n_ {1},n_ {2},\ ldots,n_ {d})} D(零基)索引NK [0,n k - 1] {\ displaystyle n_ {k} \在[0,n_ {k} -1]}中。
在行主要顺序中,最后一个维度是连续的,因此此元素的内存偏移量由以下给出:
nd + n d⋅(nd - 1 + n d-1⋅(nd - 2 + n d-2⋅(⋯+ n 2 n 1)⋯))))=σk= 1 d(π= k + 1 d nℓ)nk {\ displaystyle n_ {d} + n_ {d} \ cdot(n_ {d-1} + n_ {d-1} \ cdot(n_ {d-2} + n_ {d-2} \ CDOT(\ cdots + n_ {2} n_ {1})\ cdots)))= \ sum _ {k = 1} ^ {d} \ left(\ prod _ {\ ell = k + 1} ^ {d} n _ {\ ell} \右)n_ {k}}
在列主要顺序中,第一维度是连续的,因此该元素的内存偏移量由以下给出:
n 1 + n 1⋅(n 2 + n 2⋅(n 3 + n 3⋅(⋯+ n d-1 nd)⋯)))=σk= 1d(π= 1 k - 1 n =) nk {\ displaystyle n_ {1} + n_ {1} \ cdot(n_ {2} + n_ {2} \ cdot(n_ {3} + n_ {3} \ cdot(\ cdots + n_ {d-1} n_ {d})\ cdots))))= \ sum _ {k = 1} ^ {d} \ left(\ prod _ {\ ell = 1} ^ {k-1} n _ {\ ell} \ revaly)n_ { k}}
其中空产品是乘法标识元素,即π= 1 0n≥=π= d + 1 dn∈= 1 {\ displaystyle \ prod _ {\ ell = 1} ^ {0} n _ {\ ell} = \ prod _ {\ ell = d + 1} ^ {d} n _ {\ ell} = 1}。
对于给定的顺序,尺寸k中的步幅被递送值在上面的右手侧求和中的索引n k之前的括号中给出。
更一般地,有D!对于给定阵列的可能订单,一个用于每个尺寸的允许(带有行 - 主要和列 - 订单只有2个特殊情况),但步幅值的列表不一定彼此置换,例如,在2逐个中3上面的一个例子,行长的寿命是(3,1),用于柱专业的(1,2)。
Morton命令,将多维数据映射到一维索引的另一种方式,可用于树数据结构
^"语言参考版本4版本3" (PDF)。 IBM。为数组指定的初始值被分配给阵列的连续元素,以行主要订单(最终下标变化最快)。
^" ISO / IEC 7185:1990(E)" (PDF)。指定两个或多个索引类型序列的数组类型应是指定的数组类型的缩写符号,以序列中的索引类型键入第一个索引类型,并且具有符号类型一个数组类型,指定序列中的第一个索引类型的索引类型序列,并指定与原始规范相同的组件类型。
^"SAS®9.4语言参考:概念,第六版" (PDF)。 SAS Institute Inc. 2017年9月6日.. p。 573。从右到左,最右边的维度代表列;下一个维度代表行。 [...] SAS通过按顺序填充所有行,从阵列的左上角开始(称为行主要订单),将变量放置到多维数组中。
^ spiegelhalter等。 (2003,第17页):斯皮格尔哈尔特,大卫;托马斯,安德鲁;最好的,尼基; Lunn,Dave(2003年1月),"数据的格式:S-Plus格式",Winbugs用户手册(PDF)(1.4版),剑桥,英国:MRC生物卫生学单位,公共卫生研究所,从2003-05-18上存档(PDF)
^" FFT与多维数据" Scilab Wiki。由于Scilab以列主要格式存储数组,所以列的元素是线性格式的相邻(即分离1)。
^" eigen:存储订单和#34; eigen.tuxfamily.org。如果未指定存储顺序,则egen默认为存储列中的条目。
Donald E. Knuth,计算机编程艺术1:基础算法,第三版,第2.2.6节(Addison-Wesley:纽约,1997)。