Pesquisa · Mapa mental

Ordem de linha e de coluna

Na computação, ordem de linha e ordem de coluna são métodos para armazenar matrizes multidimensionais [en] em armazenamento linear, como a memória de acesso aleatório (RAM).

Fonte: Wikipédia (pt)Atualizado em 04/07/2026
01

Explicação e exemplo

Imagem: Portuguese_eyes · BY-SA · Openverse

Os termos ordem de linha (row-major) e ordem de coluna (column-major) derivam da terminologia relacionada à ordenação de objetos. Uma maneira geral de ordenar objetos com muitos atributos é primeiro agrupá-los e ordená-los por um atributo e, em seguida, dentro de cada grupo, agrupá-los e ordená-los por outro atributo, etc. Se mais de um atributo participar da ordenação, o primeiro seria chamado de maior (major) e o último de menor (minor). Se dois atributos participarem da ordenação, é suficiente nomear apenas o atributo maior. No caso de arranjos, os atributos são os índices ao longo de cada dimensão. Para matrizes em notação matemática, o primeiro índice indica a linha e o segundo indica a coluna, por exemplo, dada uma matriz A {\displaystyle A} , a entrada a 1 , 2 {\displaystyle a_{1,2}} está em sua primeira linha e segunda coluna. Essa convenção é transportada para a sintaxe em linguagens de programação, embora frequentemente com índices começando em 0 [en] em vez de 1.

02

Linguagens de programação e bibliotecas

Imagem: Portuguese_eyes · BY-SA · Openverse

Linguagens de programação ou suas bibliotecas padrão que suportam arranjos multidimensionais normalmente têm uma ordem de armazenamento nativa de linha ou coluna para esses arranjos. A ordem de linha é usada em C/C++/Objective-C (para arranjos estilo C), PL/I, Pascal, Speakeasy, e SAS [en]. A ordem de coluna é usada em Fortran, IDL [en], MATLAB, GNU Octave, Julia, S, S-PLUS, R, Scilab, Yorick e rasdaman [en].

Nem ordem de linha nem ordem de coluna

Uma alternativa típica para armazenamento de arranjos densos é usar vetores de Iliffe [en], que normalmente armazenam ponteiros para elementos na mesma linha de forma contígua (como ordem de linha), mas não as linhas em si. Eles são usados em (ordenados por idade): Java, C#/CLI/.Net, Scala, e Swift. Ainda menos denso é usar listas de listas, por exemplo, em Python, e na Wolfram do Wolfram Mathematica. Uma abordagem alternativa usa tabelas de tabelas, por exemplo, em Lua.

Bibliotecas externas

O suporte para arranjos multidimensionais também pode ser fornecido por bibliotecas externas, que podem até suportar ordenações arbitrárias, onde cada dimensão tem um valor de passo (stride), e a ordem de linha ou ordem de coluna são apenas duas interpretações resultantes possíveis. A ordem de linha é o padrão no NumPy (para Python). A ordem de coluna é o padrão no Eigen [en] e Armadillo (ambos para C++). Um caso especial seria o OpenGL (e OpenGL ES) para processamento gráfico. Como "tratamentos matemáticos recentes de álgebra linear e campos relacionados invariavelmente tratam vetores como colunas", o designer Mark Segal decidiu substituir isso pela convenção no predecessor IRIS GL [en], que era escrever vetores como linhas; para compatibilidade, as matrizes de transformação ainda seriam armazenadas em ordem de vetor-maior (=ordem de linha) em vez de coordenada-maior (=ordem de coluna), e ele então usou o truque "[de] dizer que as matrizes no OpenGL são armazenadas em ordem de coluna". Isso era realmente relevante apenas para apresentação, porque a multiplicação de matrizes era baseada em pilha e ainda podia ser interpretada como pós-multiplicação, mas, pior, a realidade vazou através da API baseada em C porque elementos individuais seriam acessados como M[vetor][coordenada] ou, efetivamente, M[coluna][linha], o que infelizmente confundiu a convenção que o designer procurava adotar, e isso foi até preservado na OpenGL Shading Language que foi adicionada posteriormente (embora isso também torne possível acessar coordenadas por nome, por exemplo, M[vetor].y). Como resultado, muitos desenvolvedores agora simplesmente declararão que ter a coluna como o primeiro índice é a definição de ordem de coluna, embora este claramente não seja o caso com uma linguagem de ordem de coluna real como Fortran.

03

Transposição

Imagem: Portuguese_eyes · BY-SA · Openverse

Como trocar os índices de um arranjo é a essência da transposição de arranjo, um arranjo armazenado como ordem de linha, mas lido como ordem de coluna (ou vice-versa), parecerá transposto. Como a realização real desse rearranjo na memória [en] é tipicamente uma operação cara, alguns sistemas fornecem opções para especificar matrizes individuais como sendo armazenadas transpostas. O programador deve então decidir se deve ou não reorganizar os elementos na memória, com base no uso real (incluindo o número de vezes que o arranjo é reutilizado em um cálculo). Por exemplo, as funções BLAS [en] recebem sinalizadores indicando quais arranjos estão transpostos.

04

Cálculo de endereço em geral

Imagem: Portuguese_eyes · BY-SA · Openverse

O conceito generaliza para arranjos com mais de duas dimensões. Para um arranjo de dimensão d N 1 × N 2 × ⋯ × N d {\displaystyle N_{1}\times N_{2}\times \cdots \times N_{d}} com dimensões Nk (k=1...d), um dado elemento desse arranjo é especificado por uma tupla ( n 1 , n 2 , … , n d ) {\displaystyle (n_{1},n_{2},\ldots ,n_{d})} de d índices (baseados em zero) n k ∈ [ 0 , N k − 1 ] {\displaystyle n_{k}\in [0,N_{k}-1]} . Na ordem de linha, a última dimensão é contígua, de modo que o deslocamento de memória (memory-offset) desse elemento é dado por: n d + N d ⋅ ( n d − 1 + N d − 1 ⋅ ( n d − 2 + N d − 2 ⋅ ( ⋯ + N 2 n 1 ) ⋯ ) ) = ∑ k = 1 d ( ∏ ℓ = k + 1 d N ℓ ) n k {\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 }\right)n_{k}} Na ordem de coluna, a primeira dimensão é contígua, de modo que o deslocamento de memória desse elemento é dado por: n 1 + N 1 ⋅ ( n 2 + N 2 ⋅ ( n 3 + N 3 ⋅ ( ⋯ + N d − 1 n d ) ⋯ ) ) = ∑ k = 1 d ( ∏ ℓ = 1 k − 1 N ℓ ) n k {\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 }\right)n_{k}} onde o produto vazio é o elemento neutro multiplicativo, ou seja, ∏ ℓ = 1 0 N ℓ = ∏ ℓ = d + 1 d N ℓ = 1 {\textstyle \prod _{\ell =1}^{0}N_{\ell }=\prod _{\ell =d+1}^{d}N_{\ell }=1} .

Vídeos recomendados

Fontes consultadas

Continue pesquisando