VETORES ou MATRIZES

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

VETORES ou MATRIZES

Mensagem por Pablo César »

A pedido do colega, vou intentar passar o meu conhecimento, mesmo eu não sendo EXPERT na matéria. e peço pros meus outros colegas que me ajudem e me corrijam caso eu esteja enganado.

Conceito segundo o WIKIPEDIA:
As linhas horizontais da matriz são chamadas de linhas e as linhas verticais são chamadas de colunas. Uma matriz com m linhas e n colunas é chamada de uma matriz m por n (escreve-se m×n) e m e n são chamadas de suas dimensões, tipo ou ordem.

Um elemento de uma matriz A que está na i-ésima linha e na j-ésima coluna é chamado de elemento i,j ou (i,j)-ésimo elemento de A. Ele é escrito como Ai,j ou A[i,j].

Uma matriz onde uma de suas dimensões é igual a 1 é geralmente chamada de vetor. Uma matriz 1 × n (uma linha e n colunas) é chamada de vetor linha ou matriz linha, e uma matriz m × 1(uma coluna e m linhas) é chamada de vetor coluna ou matriz coluna.

Imagem

Talvez eu esteja errado. O que eu entendo:

VETOR e MATRIZ seriam a mesma coisa. Mas irei mencionar com o nome de VETOR (porque acho mais sintético pra falar):

VETOR é uma espécie de variável que pode possuir apenas um VETOR_COLUNA e pode ter um ou vários elementos. Elemento, é a uma unidade ´da qual surgiu na divisão desse tipo de variável. Os elementos de um vetor UNIDIMENSIONAL é como os registros no DBF, mas imagine um VETOR como um DBF com um campo apenas e um ou vários registros que estaria indicados no gráfico como VETOR_LINHA.

Você pode criar UM VETOR vazio, assim==> VETOR:={}
E pode declarar um vetor com elementos nulos assim==> DECLARE VETOR[5], isto que dizer que o vetor chamado VETOR, tem 5 elementos nulos que poderá ser atribuídos valores a cada elementos. Podendo ser tipo: caracter, numérico, datas e lógico.

Os VETORES ou MATRIZES podem também conter mais do que UMA quantidade de VETOR_COLUNA (como se fossem campos no DBF) mais do que UMA quantidade de VETOR_LINHA (como se fossem registros no DBF). Isto é, podem ser MULTIDIMENSIONAL.

Um exemplo prático veja no código abaixo:
AA:={{"A1","B1"},{"A2","B2"},{"A3","B3"}}
? "AA:={{"A1","B1"},{"A2","B2"},{"A3","B3"}} - Matriz com 3 VETORES_LINHA e 2 VETORES_COLUNA (Total de elementos: 6 elementos)"
? SPACE(8)+AA[1,2] // Desta forma pego o elemento da 1ª coluna do 2ª linha
? LEN(AA) // Para saber a quantidade em número de colunas (campos em DBF)
? LEN(AA[1]) // Para saber a quantidade em número de linhas (da 1ª coluna)

Algumas das funções do Clipper relacionadas com VETORES são:
AADD
ACHOICE
ACLONE
ADEL
ACOPY
ADIR
AEVAL
AFIELDS
AFILL
AINS
ARRAY
ASCAN
ASIZE
ASORT

Imagino que as perguntas irão surgir, senão é porque ja entenderam como funciona.

Espero ter ajudado. Um clip abraço

:)Pos
Obs.: Este tópico poderá ser RE-EDITADO para corregir qualquer informação erronea. Favor notar texto em cor vermelho foi RE-EDITADO.
Editado pela última vez por Pablo César em 16 Abr 2007 13:04, em um total de 3 vezes.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Pablo , acho que erra disso mesmo que eu precisava ! VLw

outra questão , estas funções se encontram no ng ?? :|<
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Sim Ederxc, essas funções que foram listadas, fazem parte do Clipper e poderá encontrá-las da documentação através do NG e seus exemplos.

Que bom que a minha explicação sirviu para o seu esclarecimento. A utilização de vetores é muito prático e útil. Uma função que está relacionada com vetores é a DIRECTORY() ou ADIR(), com esta função você poderia começar a fazer testes, ela é ótima para entender MATRIZES ou VETORES. Muitos de nós utilizamos os VETORES para guardar a posição de cada impressão de etiqueta (linha e coluna). Para atribuir valores (sejam numéricas, caracteres, datas ou lógico), você a faz como se fossem variáveis comuns, claro que para vetores ou matrizes, deves colocar o endereço do elemento. Exemplo: VETOR[1,1]:=DATE(), VETOR[1,1]:="TESTE", VETOR[1,1]:=0.00 ou VETOR[1,1]:=.T.
Embora se você quer adicionar um elemento a esse VETOR, e esse VETOR é um vetor UNIDIMENSIONAL, você pode fazer assim:

AADD(VETOR,DATE())
AADD(VETOR,"TESTE")
AADD(VETOR,0.00)
AADD(VETOR,.T.)

Podes também atribuir o conteúdo de um campo de DBF. Exemplo:

SELE 1
USE CLIENTES INDEX CLI_NOM
SEEK "PABLO CESAR" // (Este é meu nome, tá... não é Paulo, ok ?)
AADD(VETOR,(1->ENDERECO))
AADD(VETOR,DTOC(1->DATANAS))
AADD(VETOR,TRANSFOM(1->CREDITO,"@E 9,999.99"))
AADD(VETOR,IF(1->IMPRIMIU,"Sim","Näo"))

// Daí você pode trabalhar com esse vetor. Por exemplo concatenando-os:

VLINHA:=""
FOR i=1 TO LEN(VETOR)
VLINHA:=VLINHA+VETOR+" - "
NEXT
Essa concatenação ficará numa só linha e podes imprimir em tela
? VLINHA // RUA DE LÁ - 01/01/2007 - 1.234,56 - Sim

Mas se tiveres dúvidas pode postar aqui sua perguntas.

Um clip-abraço :)Pos
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Pablo,

Será que vc não se confundiu? As matrizes são referenciadas por LINHA e COLUNA e não ao contrário. Então, no seu exemplo, não está trocado, não seria 3 linhas e 2 colunas?

? "AA:={{"A1","B1"},{"A2","B2"},{"A3","B3"}} - Matriz com 3 VETORES_COLUNA e 2 VETORES_LINHA

Outra coisa: matrizes não se limitam a 2 dimensões. Parece que as funções do Clipper (tipo AADD()) só funfam com 2, mas vc pode ter mais dimensões. Por exemplo:
declare mat[2,5,6] -> matriz com 2 planos, 5 linhas, 6 colunas
mat[2.3.1]="p2l3c1" -> atribui "p2l3c1" na coluna 1 da linha 3 do plano 2


Aproveito pra perguntar: já li alguma coisa a respeito de que se deve evitar o uso de matrizes, porque elas usam muita memória (em relação à mesma coisa feita com strings). Alguém pode confirmar isso?

Eolo
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Aproveito pra perguntar: já li alguma coisa a respeito de que se deve evitar o uso de matrizes, porque elas usam muita memória (em relação à mesma coisa feita com strings). Alguém pode confirmar isso?
Tche nunca ouvi falar mas gostaria de saber tb.

Abraços
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Eolo escreveu:As matrizes são referenciadas por LINHA e COLUNA e não ao contrário
Correto, Eolo. Eu quando escreví isso, logo fiquei em dúvida e pensei (seu eu estiver errado alguém vai acusar o meu erro). Por isso que na 1ª mensagem coloquei:
Obs.: Este tópico poderá ser RE-EDITADO para corrigir qualquer informação erronea.
Eu acho que você está certo. Partindo do conceito "ordem principal de linhas", é correto interpretar quando existem duas dimensões, pensar no primeiro índice como "linha" e no segundo como "coluna". Vou corregir na minha primeira mensagem assim não dá confusão. Favor notarem que será corrigido a minha 1ª mensagem. Isto é será RE-EDITADA.
Eolo escreveu:Outra coisa: matrizes não se limitam a 2 dimensões.
Pois é Eolo, na verdade o Clipper não tem um conceito de vetor multidimensional. No entanto, permite que um elemento de vetor possa ser de qualquer tipo, inclusive um outro vetor.

O que nós chamamos de vetores multidimensionais são, na verdade VETORES onde cada elemento é um outro VETOR. Em si, deveriam chamar-se de VETORES ANINHADOS. Em razão disso, os subvetores não precisam ser do mesmo tamanho. Você pode criar um vetor onde alguns elementos são vetores e outros não.

Por consequente, na minha mensagem que diz que o VETOR pode ser do tipo caracter, data, numérico, lógico, endenda-se que também pode ser tipo VETOR.
Eolo escreveu:Aproveito pra perguntar: já li alguma coisa a respeito de que se deve evitar o uso de matrizes, porque elas usam muita memória
Sim Eolo, os vetores MULTIDIMENSIONAIS podem consumir quantidades enormes de memória. Isto eu já lí, se não me engano foi o Rick Spence que disse isso e faz sentido. Mas também deve ser levado em conta as mesmas restrições que do mesmo modo são aplicadas as variáveis sobre LOCAL, PRIVATE, PUBLIC e STATIC.

Obrigado Eolo por colocar mais luz sobre este assunto. É sempre importante participar e esclarecer coisas que alguém pode neglegenciar.

Um clip-abraço :)Pos
Editado pela última vez por Pablo César em 16 Abr 2007 10:47, em um total de 1 vez.
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Eolo escreveu:Aproveito pra perguntar: já li alguma coisa a respeito de que se deve evitar o uso de matrizes, porque elas usam muita memória (em relação à mesma coisa feita com strings). Alguém pode confirmar isso?

Eolo
Acho que o MALIGNO pode nos esclarecer esse ponto... já vi ele falando sobre isso em algum lugar...

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Pablo,

Vc disse
Pois é Eolo, na verdade o Clipper não tem um conceito de vetor multidimensional.
e não é bem assim. Faça o teste com o exemplo que eu dei
declare mat[2,5,6] -> matriz com 2 planos, 5 linhas, 6 colunas
mat[2.3.1]="p2l3c1" -> atribui "p2l3c1" na coluna 1 da linha 3 do plano 2
com vários layers (ou planos), funciona normal, só que sem usar as funções de arrays. Inclusive, vc pode até fazer mais, como por exemplo mat[3,3,3,3]... ou até onde a memória aguentar.

Eolo
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Eu nunca li nada a respeito de matrizes consumirem mais memória que strings (nem nunca li livro nenhum sobre Clipper), mas intuitivamente é bem fácil perceber que isso é verdadeiro. Uma string é uma "stream" (fila) de caracteres. Além da própria string, é consumido apenas um terminador nulo. Por outro lado, uma matriz pode consumir vários terminadores nulos para cada string e, adicionalmente, vários ponteiros, no caso de matrizes multidimensionais.

Agora, se o Clipper tem matrizes multidimensionais ou não, é uma questão inócua, já que pelo Clipper é possível produzir o efeito de uma matriz multidimensional. Neste caso, aquilo que convencionou-se chamar de matriz multidimensional existe no Clipper sim.

Nunca ouvi falar do termo "vetores aninhados" em qualquer linguagem que tenha tido contato. Mas ele é compreensível e pode ser aceito, já que a linguagem XBase não é tipada. Logo, é possível ter elementos de matriz de tipos diferentes. Isso sim, consome ponteiros a mais e ainda exige mais processamento para uma aritmética mais complexa. Em linguagens tipadas a manipulação de ponteiros ainda existe, claro. Isso também consome mais processamento. Mas como os tipos sempre são iguais, utiliza-se apenas aritmética de ponteiros mais simples para acessar os elementos, ao invés de muitos ponteiros diretos (e calculados a partir da base) para os elementos, como ocorre com XBase.

Em suma: isso tudo é convenção. Na prática, o comportamento de matrizes é praticamente igual a qualquer outra linguagem. É bom lembrar-se apenas que manipular matrizes multidimensionais consumirá tanto mais processamento quanto mais complexa for a matriz. De resto, problema nenhum. É usar o recurso quando for necessário.

Aliás, uma lembrança: o uso de matrizes, em Clipper, tem um outro aspecto interessante: para aqueles que utilizam muitas variáveis de memória, pode ser uma boa idéia armazená-las numa matriz, pois internamente o Clipper mantém em tabela uma entrada para cada símbolo. Ao agrupar essas variáveis em matriz pode-se economizar um bocado de memória nessa tabela, o que pode evitar erros de "compile-time".

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Maligno escreveu:Nunca ouvi falar do termo "vetores aninhados" em qualquer linguagem que tenha tido contato. Mas ele é compreensível e pode ser aceito, já que a linguagem XBase não é tipada.
Como eu disse antes, não sou EXPERT neste assunto, mas MALIGNO eu discordo com você sobre o termo "vetores aninhados", pois desde que comecei a entender os vetores/matrizes esses termos tem me acompanhado. E inclusive se procurar na internet irás a encontrar muito sobre isto. Em inglês é utilizado "nested arrays" e não me parece ser apenas uma disposição somente do Clipper. Mas no resto muito eu concordo e parte de outras da forma que foi exposta devo admitir que me pareceu bem comprensivel.

E agradeço seus esclarecimentos. Se quiserem ver outras opiniões sobre
http://www.ghservices.com/gregh/clipper/trix0010.htm aqui menciona sobre alocação de memória, diferenciando-se entre outras linguagens (linguagem C e Pascal)

Um clip-abraço :)Pos
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

eu discordo com você sobre o termo "vetores aninhados", pois desde que comecei a entender os vetores/matrizes esses termos tem me acompanhado.
Mas eu não duvidei que o termo existe. Só disse que não o conhecia. Se um dia vi, passou batido.
Além do mais, isso é uma questão semântica que não faz diferença alguma. O importante é que o conceito pode ser aplicado ao Clipper e até mesmo em linguagens fortemente tipadas, como C, por exemplo. Muito embora, em C, o termo comum é matriz multidimensional, justamente pelo aspecto da tipagem que comentei. Mas você poder "ver" multidimensão como "aninhamento", se preferir.
Eu vejo "aninhamento" apenas em código, onde ele, legitimamente, se aplica. Um bom exemplo é um bloco de controle com diversos IFs aninhados.
Mas isso tudo é discussão acadêmica que no campo prático, realmente, não faz a menor diferença.

O termo "nested array", apenas para complementar, até pode ser encontrado em diversas referências na Internet. Mas o que conta mesmo é a literatura técnica confiável. Apenas a título de curiosidade: na norma ISO/IEC 14882, que normatiza a linguagem C++, o termo "nested array" simplesmente não existe. O mesmo vale para a norma de C. Como eu sempre me baseio nessas normas, o termo "nested array" pra mim não tem validade alguma. É ficção. A linguagem XBase, por seu lado, não é normatizada. Portanto qualquer um é livre pra "cunhar" novos termos quando bem entender. O problema fica apenas na comunicação. Talvez outros programadores simplesmente não entendam de imediato o que significa "matriz aninhada". Aí entra o bom senso: matriz multidimensional todo mundo sabe o que é.
Mas só pra frisar, repito: essa discussão é inócua. O que conta mesmo é o aspecto prático.

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Pessoal, agora quem está precisando de uma ajuda, sou eu !. Estou precisando ordenar em ordem crescente de data na minha MATRIZ "ANINHADA" e não consigo fazer isto. Passei abaixo um exemplo da minha matriz:

AR:={{},{},{},{}}
AADD(AR[1],"NOME A")
AADD(AR[2],0)
AADD(AR[3],CTOD("01/02/2007"))
AADD(AR[4]," ")

AADD(AR[1],"NOME B")
AADD(AR[2],1)
AADD(AR[3],CTOD("22/01/2007"))
AADD(AR[4]," ")

AADD(AR[1],"NOME C")
AADD(AR[2],5)
AADD(AR[3],CTOD("12/04/2007"))
AADD(AR[4]," ")

AADD(AR[1],"NOME D")
AADD(AR[2],8)
AADD(AR[3],CTOD("05/03/2007"))
AADD(AR[4]," ")

Agora preciso usar o ASORT e não estou conseguido ordenar por ordem de data. Em outro tipo de MATRIZ, ora gerada pelo VDIR:=DIRECTORY(), no qual não é uma MATRIZ aninhada como a minha, então o ASORT para o VDIR eu fazia:

VDIR:=ASORT(VDIR,,,{ |x,y| DTOS(x) < DTOS(y) })

Mas se eu tentar do mesmo modo para a minha matriz AR, dá error BASE/1120 Argument error: DTOS, porque não está pegando os elementos da terceira coluna_vetor.

Preciso ajuda... please ! :( :'(
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Pablo,

Tá dando erro pelo seguinte: vc adiciona, na matriz, strings: AADD(AR[3],CTOD("01/02/2007"))... e não datas.

Depois, quando vc tenta fazer DTOS(x), dá AREGUMENT ERROR porque o a função espera uma data, e X não é data, é string.

Eolo
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Não Eolo, o conteúdo da terceira coluna_vetor é do tipo data sim veja que dei um exemplo e aqui eu pus CTOD (que transforma caracter to data).

Dá erro mesmo porque ele está lendo a matriz como se fosse assim:

AR:={ {"NOME A",0,CTOD("01/02/2007")," "},{"NOME B",1,CTOD("22/01/2007")," "},{"NOME C",5,CTOD("12/04/2007")," "},{"NOME D",8,CTOD("05/03/2007")," "} }

e na verdade meu vetor é assim:

AR:={ {"NOME A","NOME B","NOME C","NOME D"},{0,1,5,8},{CTOD("01/02/2007"),CTOD("02/01/2007"),CTOD("12/04/2007"),CTOD("01/02/2007")},{" "," "," "," "}

Então não estou conseguindo pegar a coluna_vetor onde estão as datas. É uma questão de disposição de vetores.

Veja pelo CLD que no debugger você verá o que estaria errado. Já não sei como fazer... Imagem
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Pablo,
Putz, pisei no tomate! Desculpe.
Pensei rápido demais e falei besteira da grossa! Desculpe.
Vou olhar (agora do jeito certo) e já retorno...
Eolo
Responder