VectorLib


4. VectorLib Funções e Rotinas: Uma Visão Curta

4.1 Geração, inicialização e desalocação de vetores
4.2 Manipulações orientadas para o Índice
4.3 Interconversões de Tipo de Dados
4.4 Mais sobre Integer Aritméticos
4.5 Funções básicas de vetores complexos
4.6 Funções matemáticas
4.6.1 Arredondamento
4.6.2 Comparações
4.6.3 Manipulação de bits direta
4.6.4 Aritmética básica, Acumulações
4.6.5 Aritmética de vetor geométrico
4.6.6 Poderes
4.6.7 Exponenciais e funções hiperbólicas
4.6.8 Logaritmos
4.6.9 Funções de trigonometria
4.7 Análise
4.8 Processamento de sinal: transformações de Fourier e tópicos relacionados
4.9 Funções estatísticas e blocos de construção
4.10 Data Fitting
4.11 Entrada e saída
4.12 Gráficos

4.1 Geração, Inicialização e Desalocação de Vetores


Com o VectorLib, você pode usar matrizes estáticas (como, por exemplo, flutuador a [100];), bem como alocadas dinamicamente (ver chapter 2.3). Recomendamos, no entanto, que você use os tipos de vetores mais flexíveis definidos pelo VectorLib, usando alocação dinâmica.

As seguintes funções gerem vetores dinamicamente alocados: 

VF_vectoralocação de memória para um vetor
VF_vector0alocação de memória e inicialização de todos os elementos com 0
V_freeUm vetor gratuito
V_nfree vetores n gratuitos (apenas para C, não para Pascal)
V_freeAllTodos os vetores gratuitos
 
Você deve sempre cuidar adequadamente para desalocar a memória de vetores que não são mais necessários. Internamente, os vetores alocados são escritos em uma tabela para acompanhar a memória alocada. Se você tentar liberar um vetor que nunca foi ou não está mais alocado, você recebe uma mensagem de aviso e nada é liberado.

Dicas de desempenho:

  • Os vetores alocados pelo VF_vector estão alinhados em limites de 64 bytes para uma correspondência de linha de cache ótima (Intel Pentium XX: 32 bytes, AMD Athlon e todos os processadores de 64 bits por AMD e Intel: 64 bytes). Por outro lado, matrizes estáticas, bem como vetores criados pelo operador novo ou pelas funções padrão, malloc, calloc, GetMem, LocalAlloc, GlobalAlloc etc. estão alinhados apenas em limites de 4 bytes. Conseqüentemente, para o melhor desempenho, você deve usar apenas vetores alocados pelo VF_vector etc.
  • Os comandos SIMD empregados nas versões P6 e P7 exigem que os dados sejam alinhados em limites de 16 bytes. Mais uma vez o mesmo conselho: Use os vetores dinâmicos do OptiVec para garantir o alinhamento necessário. A penalidade por dados não devidamente alinhados pode representar 25%.
  • Em vez de muitos vetores pequenos, considere alocar um vetor grande. Defina os vetores pequenos como partes do maior:
    C/C++:
    X = VF_vector( 3*size);
    Z = (Y = X+size) + size;
    Pascal/Delphi:
    X := VF_vector( 3*size );
    Y := VF_Pelement( X, size );
    Z := VF_Pelement( Y, size );
    Certifique-se de que o tamanho seja arredondado de modo a tornar o tamanho * sizeof (tipo de dados) um múltiplo de 32 ou 64
  • Evite alocação frequente e desalocação. Tente reutilizar vetores em vez disso.

As seguintes funções são usadas para inicializar ou reinicializar vetores que já foram criados: 

VF_equ0defina todos os elementos de um vetor igual a 0
VF_equ1defina todos os elementos iguais a 1
VF_equm1defina todos os elementos iguais a -1
VF_equCdefina todos os elementos iguais a uma constante C
VF_equVfaça um vetor uma cópia de outro
VFx_equV"Versão "expandida" da operação de igualdade: Yi = a * Xi + b
VF_ramp"ramp": Xi = a * i + b.
VF_randomnúmeros aleatórios de alta qualidade
VF_noiseruído branco
VF_comb"pente": é igual a uma C constante em pontos equidistantes, em outro lugar 0
 
As seguintes funções geram janelas para uso na análise espectral: 
VF_HannHann window
VF_ParzenParzen window
VF_WelchWelch window
 
Os vetores complexos podem ser inicializados por estas funções: 
VF_ReImtoCmerge two vectors, Re e Im, fundir dois vetores, Re e Im, em um vetor complexo cartesiano
VF_RetoCsubstituir a parte real de um vetor complexo cartesiano
VF_ImtoCsubstituir a parte imaginária de um vetor complexo cartesiano
VF_PolartoCconstruir um vetor complexo cartesiano a partir de coordenadas polares, inserido como vetores separados Mag and Arg
VF_MagArgtoPmesclar dois vetores, Mag e Arg em um vetor complexo polar
VF_MagArgtoPrincipalfundir dois vetores, Mag e Arg em um vetor complexo polar, reduzindo o intervalothe Arg para o valor principal, -p < Arg <= +p
VF_MagtoPsubstituir a parte Mag de um vetor complexo polar
VF_ArgtoPsubstituir a parte Arg de um vetor complexo polar
VF_ReImtoPconstrua um vetor complexo polar a partir de coordenadas cartesianas, inserido como vetores separados Re e Im

4.2 Manipulações Orientadas para o Índice

VF_revinverter o pedido de elementos
VF_reflectdefina a metade superior de um vetor igual à metade inferior invertida
VF_rotategire o pedido dos elementos
VF_rotate_bufrotação eficiente, empregando memória tampão especificada pelo usuário
VF_insertinsira um elemento em um vetor
VF_deleteapague um elemento de um vetor
VF_sorttriagem rápida dos elementos (ordem ascendente ou decrescente)
VF_sortindclassificação de uma matriz de índice associada a um vetor
VF_subvectorextraia um subvector de um vetor (normalmente maior), usando um intervalo de amostragem constante.
VF_indpickenche um vetor com elementos "escolhidos" de outro vetor de acordo com seus índices.
VF_indputdistribuir os elementos de um vetor para os sites de outro vetor especificados pelos seus índices.
 
As operações realizadas apenas em um subconjunto amostrado de elementos de um vetor são fornecidas pela família VF_subvector_... onde a marca de omissão representa um sufixo denotando a operação desejada: 
VF_subvector_equC Xi*samp = C,   i=0,...subsize-1
VF_subvector_addC Xi*samp += C,   i=0,...subsize-1
VF_subvector_subC Xi*samp -= C,   i=0,...subsize-1
VF_subvector_subrC Xi*samp = C - Xi*samp,   i=0,...subsize-1
VF_subvector_mulC Xi*samp *= C,   i=0,...subsize-1
VF_subvector_divC Xi*samp /= C,   i=0,...subsize-1
VF_subvector_divrC Xi*samp = C / Xi*samp,   i=0,...subsize-1
VF_subvector_equV Yi*samp = Yi,   i=0,...subsize-1
VF_subvector_addV Xi*samp += Yi,   i=0,...subsize-1
VF_subvector_subV Xi*samp -= Yi,   i=0,...subsize-1
VF_subvector_subrV Xi*samp = Yi - Xi*samp,   i=0,...subsize-1
VF_subvector_mulV Xi*samp *= Yi,   i=0,...subsize-1
VF_subvector_divV Xi*samp /= Yi,   i=0,...subsize-1
VF_subvector_divrV Xi*samp = Yi / Xi*samp,   i=0,...subsize-1
 
A pesquisa de tabelas para valores específicos é realizada po:
VF_searchC procure o elemento de um vetor que é mais próximo de um valor predefinido C (o valor mais próximo, o mais próximo ou o mais próximo, menor ou igual, dependendo de um parâmetro "modo")
VF_searchVthe same, but for a whole array of pre-set values
 
As interpolações são realizadas: 
VF_polyinterpolinterpolação polinomial
VF_ratinterpolinterpolação racional
VF_natCubSplineInterpolInterpolação de spline cúbica natural
VF_splineinterpolinterpolação geral de spline cúbica
 

4.3 Interconversões de Tipos de Dados

A primeira coisa que deve ser dito sobre as interconversões de tipo de dados de ponto flutuante é: não as use demais. Decida qual precisão é apropriada para o seu aplicativo e, em seguida, use consistentemente a VF_, ou o VD_, ou o VE_ das funções que você precisa. No entanto, todos os tipos de dados podem ser convertidos em todos os outros, caso seja necessário. Apenas alguns exemplos são apresentados; o resto deve ser óbvio: 
V_FtoDfloat para double
V_CDtoCFcomplex<double> para complex<float> (with overflow protection)
V_PFtoPEpolar<float> para polar<extended>
VF_PtoCpolar<float> para complex<float>
V_ItoLIint para long int
V_ULtoUSunsigned long para unsigned short
V_ItoUsigned int para unsigned int. Interconversões entre tipos assinados e não assinados só podem ser realizadas com o mesmo nível de precisão. Funções como "V_UStoLI" não existem.
V_ItoFint para float
 
A conversão de números de ponto flutuante em números integer é realizada pelas seguintes funções, diferindo na forma como uma possível fração é tratada: 
VF_roundtoIredondo para o integer mais próximo
VF_choptoIrodando negligenciando ("cortando") a parte fracionada
VF_trunctoImesmo que o VF_choptoI
VF_ceiltoIem volta do próximo integer maior ou igual
VF_floortoIem volta do próximo integer menor ou igual
 
Essas operações são tratadas como funções matemáticas e são descritas adicionalmente no chapter 4.6.1.

4.4 Mais Sobre Integer Artiméticos

Embora as regras da aritmética inteira sejam bastante diretas, parece apropriado lembrar que todas as operações inteiras são executadas de forma implícita no módulo 2n, onde n é o número de bits com os quais os números estão representados. Isso significa que qualquer resultado, que se encontra fora do alcance do tipo de dados respectivo, é feito para cair dentro do alcance, perdendo os bits mais altos. O efeito é o mesmo que se várias vezes 2n tivessem sido adicionados (ou subtraídos) ao resultado "correto", conforme necessário, para alcançar o alcance legal.
Por exemplo, no tipo de dados short / SmallInt, o resultado da multiplicação 5 * 20000 é -31072. A razão para este resultado negativo aparentemente errado é que o resultado "correto", 100000, cai fora do intervalo de números short que é -32768 <= x <= +32767. short / SmallInt é um tipo de 16 bits, portanto n = 16 e 2n = 65536. Para tornar o resultado cair no intervalo especificado, o processador "subtrai" 2 * 65536 = 131072 de 100000, produzindo -31072.
Observe que os resultados intermediários transbordantes não podem ser "curados" por qualquer operação a seguir. Por exemplo, (5 * 20000) / 4 não é (como se poderia esperar) 25000, mas sim -7768.

4.5 Funções Básicas de Vetores Complexos

As seguintes funções estão disponíveis para o tratamento básico de vetores complexos cartesianos
VF_ReImtoCformam um vetor complexo cartesiano de suas partes reais e imaginárias
VF_RetoCsubstituir a parte real
VF_ImtoCsubstituir a parte imaginária
VF_CtoReImextraia as partes reais e imaginárias
VF_CtoReextraia a parte real
VF_CtoImextraia a parte imaginária
VF_PolartoCformam um vetor complexo cartesiano fora de coordenadas polares, inserido como vetores separados Mag e Arg
VF_CtoPolartransformar o complexo cartesiano em coordenadas polares, retornadas nos vetores separados Mag e Arg
VF_CtoAbsvalor absoluto (magnitude do ponteiro no plano complexo)
VF_CtoArgargumento (ângulo do ponteiro no plano complexo)
VF_CtoNormnorma (aqui definida como o quadrado do valor absoluto)
 
As funções correspondentes para coordenadas polares são:
VF_MagArgtoPmesclar dois vetores, Mag e Arg em um vetor complexo polar
VF_MagArgtoPrincipalfundir dois vetores, Mag e Arg reduzindo o intervalo Arg reduzindo o intervalo, -p < Arg <= +p
VF_MagtoPsubstituir a parte Mag de um vetor complexo polar
VF_ArgtoPsubstituir a parte Arg de um vetor complexo polar
VF_PtoMagArgextraia as peças Mag e Arg
VF_PtoMagextraia a parte Mag
VF_PtoArgextraia a parte Arg
VF_PtoNormnorma (aqui definida como o quadrado da magnitude)
VF_ReImtoPconstrua um vetor complexo polar a partir de coordenadas cartesianas, inserido como vetores separados Re e Im
VF_PtoReImtransforme um vetor complexo polar em dois vetores reais, representando as coordenadas cartesianas correspondentes Re and Im
VF_PtoReCalcule a parte real dos números de entrada complexos polares
VF_PtoImcalcular a parte imaginária dos números de entrada complexos polares
VPF_principalcalcule o valor principal. Você pode lembrar que cada número complexo tem um número infinito de representações em coordenadas polares, com os ângulos diferentes por um múltiplo inteiro de 2 p. A representação com -p < Arg <= +p é denominada valor principal.
 

4.6 Funções Matemáticas

Faltando uma definição mais bem fundamentada, denotamos como "matemáticas" todas aquelas funções que calculam cada elemento de um vetor a partir do elemento correspondente de outro vetor por uma fórmula matemática mais ou menos simples:
Yi = f( Xi ).
Com exceção das funções "aritmética básica", elas são definidas apenas para os tipos de dados de ponto flutuante. A maioria dessas funções matemáticas são versões vetorizadas de funções escalares ANSI C ou Pascal ou derivadas delas. Em C/C ++, os erros são manipulados por _matherr e _matherrl. No Pascal / Delphi, o OptiVec permite ao usuário controlar o gerenciamento de erros por meio da função V_setFPErrorHandling.

Além deste tratamento de erro "por elemento", os valores de retorno das funções matemáticas VectorLib mostram se todos os elementos foram processados ​​com sucesso. Em C/C ++, o valor de retorno é do tipo de dados int, no Pascal/Delphi, é IntBool. (Nós ainda não usamos o bool de tipo de dados recém-introduzido para este valor de retorno em C/C ++, para tornar o VectorLib compatível também com versões antigas de compiladores C.) Se uma função matemática funcionou sem erros, o valor de retorno é FALSO (0), caso contrário, é VERDADEIRO (qualquer número não-zero).

4.6.1 Arredondamento

Algumas das funções que convertem o ponto flutuante em vetores inteiros já foram observadas acima. O resultado dessas operações de arredondamento pode ser deixado no formato de ponto flutuante original, ou pode ser convertido em um dos tipos inteiros. As seguintes funções armazenam o resultado no formato original de ponto flutuante: 
VF_roundarredondar para o integer mais próximo
VF_choparredondar negligenciando ("cortando") a parte fracionada
VF_truncO mesmo que VF_chop
VF_ceilArredondar para o próximo inteiro maior ou igual
VF_floorArredondar para o próximo integer menor ou igual
 
As seguintes funções armazenam o resultado como integers (tipo int): 
VF_roundtoIarredondar para o integer mais próximo
VF_choptoIarredondar negligenciando ("cortando") a parte fracionada
VF_trunctoIO mesmo que VF_choptoI
VF_ceiltoIArredondar para o próximo integer maior ou igual
VF_floortoIArredondar para o próximo integer menor ou igual
 
O tipo de destino também pode ser qualquer um dos outros tipos de dados integer. Alguns exemplos devem ser suficientes: 
VF_choptoSInegligencie a parte fracionada e armazene como short int
VF_ceiltoLIArredondar e armazenar como long int
VF_floortoQIarredondar para baixo e armazenar como número integer quadrúplo, "quad"
VF_roundtoUArredondar e armazenar como unsigned
VF_ceiltoUSArredondar e armazenar como unsigned short
VD_choptoULnegligencie a parte fracionada e armazene como unsigned long

4.6.2 Comparações

As funções que realizam comparações são geralmente chamadas de VF_cmp... (onde outras letras e/ou números especificam o tipo de comparação desejado). Todo elemento de um vetor pode ser comparado com 0, ou com uma constante C, ou com o elemento correspondente de outro vetor. Existem duas possibilidades: seja a comparação realizada com as três respostas possíveis "maiores que", "iguais" ou "menores que". Nesse caso, os resultados são armazenados como números de ponto flutuante (0.0, 1.0 ou -1.0). Os exemplos são:
 
VF_cmp0compare à 0
VD_cmpCcompare à uma constante C
VE_cmpVCompare elementos vetoriais correspondentes
 
A outra possibilidade é testar se uma das seguintes condições é preenchida: "maior que", "maior ou igual a", "igual a", "não igual a", "menor que" ou "menor ou igual" para". Aqui, as respostas serão "VERDADEIRO" ou "FALSO" (1.0 ou 0.0). Exemplos são
 
VF_cmp_eq0Cheque se igual à 0
VD_cmp_gtCCheque se maior que uma constante C
VE_cmp_leVCheque se menor ou igual ao elemento vetorial correspondente
 
Alternativamente, os índices dos elementos para os quais a resposta foi "VERDADEIRO" podem ser armazenados em uma matriz de índices, como em:
 
VF_cmp_neCindarmazenar índices de elementos não iguais a uma constante C
VD_cmp_lt0indarmazenar índices de elementos inferiores a 0
VE_cmp_geVindarmazenar índices de elementos maiores ou iguais aos elementos vetoriais correspondentes
 
Enquanto as funções de comparação básica verificarem contra um limite, há uma série de funções que verificam se um vetor de elementos cai em um certo intervalo:
 
VF_cmp_inclrange0C Cheque se 0 <= x <= C  (C positivo)
or  0 >= x >= C  (C negativo)
VF_cmp_exclrange0C Cheque se 0 < x < C  (C positivo)
or  0 > x > C  (C negativo)
VF_cmp_inclrangeCC Cheque se CLo <= x <= CHi
VF_cmp_exclrangeCC Cheque se CLo < x < CHi
VF_cmp_inclrange0Cind Armazene índices de elementos 0 <= x <= C  (C positivo)
or  0 >= x > C  (C negativo)
VF_cmp_exclrange0Cind store indices of elements 0 < x < C  (C positivo)
or  0 > x > C  (C negativo)
VF_cmp_inclrangeCCind Armazene índices de elementos CLo <= x <= CHi
VF_cmp_exclrangeCCind Armazene índices de elementos CLo < x < CHi
 
As seguintes funções testam se um ou mais valores podem ser encontrados em um vetor: 
VF_iselementC retorna TRUE, se C é um elemento de um vetor
VF_iselementV Checadas por cada elemento de um vetor se ele estiver contido em uma tabela

4.6.3 Manipulação Bit Direta

Para os tipos de dados integer, várias operações bit-wise estão disponíveis, que podem ser usadas, por exemplo, para multiplicações rápidas e divisões por potências integer de 2. 
VI_shlMude os bits para a esquerda
VI_shrmude os bits para a direita
VI_oraplicar uma máscara de bit em uma operação de OR
VI_xoraplique um bit de máscara em uma operação XOR
VI_notinverta todos os bits

4.6.4 Aritmética Básica, Acumulações

Como antes, apenas a função VF_ é explicitamente chamada, mas as funções VD_ e VE_ também existem; Se faz sentido, o mesmo é verdadeiro para o complexo e para as versões de tipo integer: 
VF_negYi = - Xi
VF_absYi = | Xi |
VCF_conjYi.Re = Xi.Re; Yi.Im = -(Xi.Re)
VF_invYi = 1.0 / Xi
 
VF_equCXi = C
VF_addCYi = Xi + C
VF_subCYi = Xi - C
VF_subrCYi = C - Xi
VF_mulCYi = Xi * C
VF_divCYi = Xi / C
VF_divrCYi = C / Xi
VF_modCYi = Xi mod C
VF_equVYi = Xi
VF_addVZi = Xi + Yi
VF_subVZi = Xi - Yi
VF_subrVZi = Yi - Xi
VF_mulVZi = Xi * Yi
VF_divVZi = Xi / Yi
VF_divrVZi = Yi / Xi
VF_modVZi = Xi mod Yi
VF_add2VZi = Xi + Y1i + Y2i
VF_sub2VZi = Xi - Y1i - Y2i
 
Além dessas operações básicas, várias combinações de adição e divisão usadas com freqüência foram incluídas, para não esquecer a fórmula de Pitágoras: 
VF_hypCYi = Xi / (Xi + C)
VF_redCYi = (Xi * C) / (Xi + C)
VF_visCYi = (Xi - C) / (Xi + C)
VF_hypotCYi = sqrt( Xi² + C² )
VF_hypVZi = Xi / (Xi + Yi)
VF_redVZi = (Xi * Yi) / (Xi + Yi)
VF_visVZi = (Xi - Yi) / (Xi + Yi)
VF_hypotVZi = sqrt( Xi² + Yi²)
 
Todas as funções na coluna direita das duas seções acima também existem em uma forma expandida (com o prefixo VFx_...) em que a função não é avaliada para o próprio Xi, mas para a expressão (a * Xi + b), e. 
VFx_addV Zi = (a * Xi + b) + Yi
VFx_divrV Zi = Yi / (a * Xi + b)
 
As funções algébricas simples também existem em outra forma especial, com o resultado escalado por algum fator arbitrário. Este formulário escalado obtém o prefixo VFs_
VFs_addV Zi = C * (Xi + Yi)
VFs_subV Zi = C * (Xi - Yi)
VFs_mulV Zi = C * (Xi * Yi)
VFs_divV Zi = C * (Xi / Yi)
 
Outras operações simples incluem: 
VF_maxCajuste Yi igual a Xi o que for maior
VF_minCescolha o menor de Xi e C
VF_maxVajuste Zi igual a Xi ou Yi, o que for maior
VF_minVdefinir Zi igual a Xi or Yi, o que for menor
VF_limitLimite a gama de valores
VF_flush0ajuste todos os valores para zero que estão abaixo de um limite predefinido
VF_flushInvajuste todos os valores para zero que estão abaixo de um limite predefinido e tome o inverso de todos os outros valores
VF_intfracdividido em partes inteiras e fracionadas
VF_mantexpdividido em mantissa e exponente
 
Enquanto, em geral, todas as funções OptiVec são para vetores de entrada e saída do mesmo tipo, as funções aritméticas também existem para operações de tipo misto entre os tipos de ponto flutuante e os tipos inteiros. O resultado é sempre armazenado no tipo de ponto flutuante. Os exemplos são:
 
VF_addVIfVector Z = fVector X + iVector Y
VD_mulVULdVector Z = dVector X * ulVector Y
VE_divrVBIeVector Z = biVector Y / eVector X

Da mesma forma, existe uma família de funções para a acumulação de dados no mesmo tipo ou em tipos de dados de maior precisão. Alguns exemplos são: 

VF_accVfVector Y += fVector X
VD_accVFdVector Y += fVector X
VF_accVIfVector Y += iVector X
VQI_accVLIqiVector Y += liVector X
 
Additionally, within the floating-point data-types, you can accumulate two vectors at once:  
VF_acc2VfVector Y += fVector X1 + fVector X2
VD_acc2VFdVector Y += fVector X1 + fVector X2

4.6.5 Geometrical Vector Arithmetics

In its geometrical interpretation, a vector is a pointer, with its elements representing the coordinates of a point in n-dimensional space. There are a few functions for geometrical vector arithmetics, namely 
VF_scalprod scalar product of two vectors
VF_xprod cross-product (or vector product) of two vectors
VF_Euclid Euclidean norm

If, on the other hand, two real input vectors X and Y, or one complex input vector XY, define the coordinates of several points in a planar coordinate system, there is a function to rotate these coordinates:

VF_rotateCoordinates counter-clockwise rotation of the input coordinates specified by the vectors X and Y; the result is returned in the vectors Xrot and Yrot.
VCF_rotateCoordinates counter-clockwise rotation of the input coordinates specified by the cartesian complex vector XY; the result is returned in the vector XYrot.

4.6.6 Potências

As seguintes funções elevam números arbitrários a potências especificadas. As "versões desprotegidas" extra-rápidas podem ser empregadas em situações em que você tenha certeza absoluta de que todos os elementos de entrada produzam resultados válidos. Devido à vetorização muito mais eficiente permitida pela ausência de verificações de erro, as funções desprotegidas são até 1,8 vezes mais rápido que as versões protegidas. (Isso é verdade desde a CPU do Pentium, em computadores antigos, quase nada é ganho.) Seja, no entanto, consciente do preço que você tem que pagar por esse aumento de velocidade: em caso de erro de transbordamento, o programa falhará sem qualquer aviso.
 
Versão normalVersão desprotegidaoperação
VF_squareVFu_squaresquare
VF_cubicVFu_cubiccúbica
VF_quarticVFu_quarticquartic (quarta potência)
VF_ipowVFu_ipowPotências integer arbitrários
VF_pown.a.Potências fracionais
VF_powexpn.a.Potências fracionais, multiplicados por funções exponenciais: xrexp(x)
VF_polyVFu_polypolinomiais
 
O seguinte grupo de funções é usado para elevar números especificados para poderes arbitrários: 
VF_pow10 fractional powers of 10
VF_ipow10 Potenciais integer de 10 (armazenados como números de ponto flutuante)
VF_pow2 potências fracionários de 2
VF_ipow2 Potenciais integer de 2 (armazenados como números de ponto flutuante)
VF_exp exponential function
VF_exp10 função exponencial na base 10 (idêntico to VF_pow10)
VF_exp2 função exponencial na base 2 (idêntico to VF_pow2)
VF_expArbBase função exponencial de uma base arbitrária
VF_sqrt raiz quadrada (que corresponde ao potencial de 0.5)
 
Todas essas funções também existem no formulário "VFx_" expandido,
VFx_square: Yi = (a * Xi + b)² 
A forma expandida das funções desprotegidas tem o prefixo VFux_.

Os equivalentes de números complexos também estão disponíveis, tanto para coordenadas cartesianas como polares. Além disso, são abordados dois casos especiais:
 

VCF_powReExpo Poderes reais, fracionários de números complexos
VCF_exptoP possui um vetor de entrada cartesiano, retornando sua função exponencial em coordenadas polares.

4.6.7 Exponenciais e Funções Hiperbólicas

Uma variedade de funções são derivadas da função exponencial VF_exp (que já foi mencionada na última seção).
 
VF_exp Função exponencial
VF_expc função exponencial complementar Yi = 1 - exp[Xi]
VF_expmx2 função exponencial do quadrado negativo do argumento,
Yi = exp( -Xi² ). Esta é uma função em forma de sino.
VF_powexpn.a.poderes fracionários, multiplicados pela função exponencial, Xirexp(Xi)
VF_Gauss Função de distribuição Gaussiana
VF_erf Função de erro (Integral over the Gaussian distribution)
VF_erfc função de erro complementar, 1 - erf( Xi )
 
As funções hiperbólicas vetorizadas estão disponíveis como: 
VF_sinh Seno hiperbólico
VF_cosh Conseno hiperbólico
VF_tanh http://www.optivec.com/vecfuncs/tanh.htm
VF_coth Cotangente hiperbólica
VF_sech Secante hiperbólica
VF_cosech Cosecante hiperbólica
VF_sech2 Quadrado da secante hiperbólica

4.6.8 Logaritmos

VF_log10 logaritmo decádico (para a base 10)
VF_log logaritmo natural (à base e)
VF_ln Sinônimo para VF_log
VF_log2 http://www.optivec.com/vecfuncs/log2.htm 2)
 
Mais uma vez, os equivalentes do complexo cartesiano também existem. As versões de complexo polar, no entanto, são especiais em que sua saída está sempre em coordenadas cartesianas:
VPF_log10toC logaritmo decádico (para a base 10)
VPF_logtoC logaritmo natural (à base e)
VPF_lntoC Sinônimo para VPF_logtoC
VPF_log2toC logaritmo binário (para a base 2)

Como uma forma especial do logaritmo decádico, a Densidade Óptica é disponibilizada por uma família de funções das quais alguns exemplos estão contidos na tabela a seguir: 
VF_ODOD = log10( X0/X ) para fVector como entrada e como saída
VF_ODwDarkOD = log10( (X0-X0Dark) / (X-XDark) ) para fVector como entrada e como saída
VUS_ODtoFOD, calculado em float precisão para entrada usVector
VUL_ODtoDOD, calculado em precisão double para entrada ulVector
VQI_ODtoEwDarkOD with dark-current correction, calculado em precisão extended para entrada qiVector

4.6.9 Funções Trigonométricas

As funções trigonométricas básicas estão disponíveis em duas variantes. A primeira variante segue as regras usuais de tratamento de erros para funções de matemática, enquanto a segunda é para situações em que você sabe de antemão que todos os argumentos de entrada estarão no intervalo de -2pi <= Xi <= + 2pi. Se você optar por empregar essas funções extra-rápidas de alcance reduzido, você precisa ter certeza absoluta sobre seus vetores de entrada, pois essas funções serão bloqueadas sem aviso prévio no caso de qualquer número de entrada fora do intervalo especificado acima. As funções de alcance reduzido estão disponíveis apenas para o seno e o co-seno, pois todas as outras funções trigonométricas precisam de verificação e tratamento de erros de qualquer maneira, mesmo nesta faixa.
 
VF_sinsene
VFr_sinFunção senoidal de "faixa reduzida" extra-rápida para -2p <= Xi <= +2p
VF_coscoseno
VFr_cosCoseno para -2p <= Xi <= +2p
VF_sincosSeno e coseno de uma só vez
VFr_sincosSeno e coseno para -2p <= Xi <= +2p
VF_tantangente
VF_cotcotangente
VF_secsecante
VF_coseccosecante
 
As seguintes funções fornecem os quadrados das funções trigonométricas de uma forma mais eficiente do que pelo primeiro cálculo das funções básicas e quadrados depois: 
VF_sin2seno²
VFr_sin2seno² para -2p <= Xi <= +2p
VF_cos2coseno²
VFr_cos2coseno² para -2p <= Xi <= +2p
VF_sincos2seno² e coseno² de uma só vez
VFr_sincos2seno² e coseno² para -2p <= Xi <= +2p
VF_tan2tangente²
VF_cot2cotangente²
VF_sec2secante²
VF_cosec2cosecante²
 
Uma maneira muito eficiente de calcular as funções trigonométricas para argumentos representáveis ​​como múltiplos racionais de pi (PI) é fornecida pelas funções trigonométricas com o sufixo "rpi" (que significa "múltiplo racional de pi"). Aqui, r = p / q, onde q é constante e p é dado pelos elementos do vetor de entrada:: 
VF_sinrpiseno de p/q * p
VF_cosrpicoseno de p/q * p
VF_sincosrpiSeno e coseno de p/q * p de uma só vez
VF_tanrpitangente de p/q * p
VF_cotrpicotangente de p/q * p
VF_secrpisecante de p/q * p
VF_cosecrpicosecante de p/q * p
 
Versões ainda mais eficientes usam tabelas para obter valores usados ​​com freqüência; estas versões são denotadas pelos sufixos "rpi2" (múltiplos de p divididos por uma potência inteira de 2) e "rpi3" (múltiplos de p em um múltiplo integer de 3). Os exemplos são: 
VF_sinrpi2 seno de p / 2n * p
VF_tanrpi3 tangente p / (3*n) * p
 
Mais duas funções trigonométricas especiais são: 
VF_sinc Função sinc, Yi = sin( Xi ) / Xi
VF_Kepler Função Kepler, calculando a posição angular dependente do tempo de um planeta ou uma cometa
 
As funções trigonométricas inversas vetorizadas estão disponíveis como 
VF_asinarc sin
VF_acosarc cos
VF_atanarc tan
VF_atan2 arc tan de raios, Zi = atan( Yi / Xi )

4.7 Análise

Há várias funções que examinam as propriedades analíticas dos arrays de dados: 
VF_derivV derivado de uma matriz Y em relação a uma matriz X
VF_derivC o mesmo para intervalos constantes entre os valores X
VF_integralV valor da integral de uma matriz Y em uma matriz X
VF_runintegralV integral ponto-a-ponto ("executando")
VF_integralC integral sobre um eixo X igualmente espaçado
VF_runintegralC integral ponto-a-ponto sobre um eixo X igualmente espaçado
VF_ismonoton teste se uma matriz está subindo ou caindo de forma monótona
VF_iselementC teste, se um dado valor ocorrer dentro de um vetor
VF_searchC procure uma tabela ordenada para a entrada cujo valor se aproxima mais de um valor predefinido C
VF_localmaxima detectar maxima local (pontos cujos vizinhos direito e esquerdo são menores)
VF_localminima detectar mínimos locais (pontos cujos vizinhos direito e esquerdo são maiores)
VF_max detectar o máximo global
VF_min detectar o mínimo global
VF_maxind máximo global e seu índice
VF_minind mínimo global e seu índice
VF_absmax valor absoluto máximo global
VF_absmin valor absoluto mínimo global
VF_absmaxind valor absoluto máximo global e seu índice
VF_absminind valor absoluto mínimo global e seu índice
VF_maxexp expoente global máximo
VF_minexp Expoente mínimo global
VF_runmax "máximo "execução
VF_runmin "Mínimo “execução
 
Os equivalentes complexos do último grupo de funções são: 
VCF_maxReIm Partes máximas reais e imaginárias separadamente
VCF_minReIm partes mínimas reais e imaginárias separadamente
VCF_absmaxReIm valores reais absolutos reais e imaginários separadamente
VCF_absminReIm valores absolutos reais e imaginários mínimos separadamente
VCF_absmax maior magnitude (valor absoluto)
VCF_absmin menor magnitude
VCF_cabsmax número complexo de maior magnitude
VCF_cabsmin número complexo de menor magnitude
VCF_sabsmax número complexo para o qual a soma | Re | + | Im | é maior
VCF_sabsmin menor número complexo em termos da soma | Re | + | Im |
VCF_absmaxind maior magnitude (valor absoluto) e seu índice
VCF_absminind menor magnitude e índice
 
Somas, produtos, etc. estão disponíveis por funções agrupadas como blocos de construção estatísticos e resumidas no capítulo 4.9

Para determinar o centro de gravidade de um vetor, você tem a opção entre as duas funções a seguir
 

VF_centerOfGravityIndcentro de gravidade, retornado como um índice de elementos interpolados
VF_centerOfGravityVcentro de gravidade de um vetor Y com o eixo X explicitamente dado

4.8 Processamento de Sinal:
Transformações Fourier e Tópicos Relacionados

A lista de funções a seguir está disponível para aplicativos de processamento de sina:
VF_FFTtoC Transformação rápida de Fourier (FFT) de um vetor real; o resultado é um vetor complexo cartesiano
VF_FFT FFT de frente e para trás de um vetor real; o resultado do FFT dianteiro é empacotado em um vetor real do mesmo tamanho que o vetor de entrada
VCF_FFT FFT frente e verso de um vetor complexo
MF_Rows_FFTFFT ao longo das linhas de uma matriz; esta função pode ser usada para o processamento em lote de vários vetores de tamanho idêntico, armazenados como as linhas de uma matriz
MF_Cols_FFTFFT ao longo das colunas de uma matriz; esta função pode ser usada para o processamento em lote de vários vetores de tamanho idêntico, armazenados como as colunas de uma matriz
VF_convolve convolução com uma função de resposta dada
VF_deconvolve deconvolução, assumindo uma função de resposta dada
VF_filter filtragem espectral
VF_spectrum análise espectral
VF_autocorr Função de autocorrelação de uma matriz de dados
VF_xcorr http://www.optivec.com/vecfuncs/xcorr.htm
VF_setRspEdit definir o limite de edição para o filtro em convoluções e deconvoluções (decide sobre o tratamento das frequências "perdidas)
VF_getRspEdit recuperar o limite de edição atual

Embora eles não usem métodos de transformação de Fourier, as funções VF_biquad (filtragem bi-quadrática de áudio) e VF_smooth (forma bruta de filtragem de freqüência que remove o ruído de alta freqüência) devem ser mencionadas aqui.

4.9 Funções Estatísticas e Blocos de Construção

A seguinte coleção de funções estatísticas é oferecida pela OptiVec:
 
VF_sum soma de todos os elementos
VI_fsum soma de todos os elementos de um vetor inteiro, acumulado como um número de ponto flutuante em uma precisão dupla ou estendida
VF_prod produto de todos os elementos
VF_ssq soma de quadrados de todos os elementos
VF_sumabs soma de valores absolutos de todos os elementos
VF_rms raiz-do-meio-quadrado de todos os elementos
VF_runsum somatório
VF_runprod produto em execução
VF_sumdevC somar os desvios de uma constante predefinida, soma( |Xi-C| )
VF_sumdevV somar os desvios de outro vetor, soma( |Xi-Yi| )
VF_avdevC desvio médio de uma constante predefinida, 1 / N * soma( |Xi-C| )
VF_avdevV desvio médio de outro vetor, 1 / N * soma( |Xi-Yi| )
VF_ssqdevC soma de quadrados dos desvios de uma constante predefinida,
soma( (Xi - C)² )
VF_ssqdevV soma dos quadrados dos desvios de outro vetor,
soma( (Xi - Yi)² )
VF_chi2 função de mérito do qui-quadrado
VF_chiabs "Função de mérito "robusta", semelhante ao VF_chi2, mas com base em desvios absolutos em vez de quadrados
VF_mean média igualada (ou média) de todos os elementos
VF_meanwW "significado com pesos" de todos os elementos
VF_meanabs média igualada (ou média) dos valores absolutos de todos os elementos
VF_selected_mean mede apenas os elementos vetoriais que se enquadram em um intervalo especificado, permitindo assim excluir pontos extravagantes do cálculo da média
VF_varianceC variância de uma distribuição em relação a um valor constante predefinido
VF_varianceCwW o mesmo com ponderação não igual
VF_varianceV variância de uma distribuição em relação a outra
VF_varianceVwW o mesmo com ponderação não igual
VF_meanvar média e variância de uma distribuição simultaneamente
VF_meanvarwW o mesmo com ponderação não igual
VF_median mediana de uma distribuição
VF_corrcoeff coeficiente de correlação linear de duas distribuições
VF_distribution armazena dados em uma função discreta de distribuição unidimensional
VF_min_max_mean_stddev cálculo simultâneo do mínimo, máximo, médio e desvio padrão de uma distribuição unidimensional

4.10 Data Fitting

Variando de uma regressão linear simples para problemas de montagem complexos envolvendo múltiplos conjuntos de dados e funções não-lineares com muitos parâmetros ajustáveis, o OptiVec oferece rotinas para praticamente todas as tarefas de montagem de dados que ocorrem praticamente. Como todos eles, com exceção da regressão linear simples, dependem de métodos de matriz, eles realmente fazem parte do #include <MFstd.h> (<MDstd.h>< MEstd.h>) ou a unidade MFstd, (MDstd, MEstd). Nos modelos de 16 bits do Borland C/C ++, você também deve incluir o arquivo MC ??. LIB para o modelo respectivo. Uma descrição detalhada dos vários conceitos de ajuste de dados é dada em outro lugar. Portanto, neste local, as funções de montagem X-Y disponíveis são resumidas apenas na tabela a seguir:
 

VF_linregress Regressão linear ponderada igualmente em dados X-Y
VF_linregresswW o mesmo com ponderação não igual
VF_polyfit montagem de um conjunto de dados X-Y em um polinômio
VF_polyfitwW o mesmo para ponderação de ponto de dados não-igual
VF_linfit montagem de um conjunto de dados X-Y para uma função arbitrária linear em seus parâmetros
VF_linfitwW o mesmo para ponderação de ponto de dados não-igual
VF_setLinfitNeglect definir o limite para negligenciar (ou seja, definir igual a zero) um parâmetro de ajuste A [i], se sua significância for menor do que o limite
VF_getLinfitNeglect recuperar o limite de significância atual
VF_nonlinfit montagem de um conjunto de dados X-Y para uma função arbitrária, possivelmente não-linear
VF_nonlinfitwW o mesmo para ponderação de ponto de dados não-igual
VF_multiLinfit montagem de vários conjuntos de dados X-Y para uma função linear comum
VF_multiLinfitwW o mesmo para ponderação de ponto de dados não-igual
VF_multiNonlinfit montagem de vários conjuntos de dados X-Y para uma função não linear comum
VF_multiNonlinfitwW o mesmo para ponderação de ponto de dados não-igual
 

4.11 Entrada e Saída

VF_cprint imprima os elementos de um vetor na tela (ou "console" - daí o "c" no nome) na janela de texto atual, detectando automaticamente sua altura e largura. Depois de imprimir uma página, o usuário é solicitado a continuar. (Somente para DOS)
VF_print é semelhante a VF_cprint na medida em que a saída é direcionada para a tela, mas não há detecção automática dos dados da tela; é assumida uma largura de linha padrão de 80 caracteres, e nenhuma divisão em páginas é feita. (Somente para DOS e EasyWin)
VF_fprint imprima um vetor para um fluxo.
VF_write escreva dados em formato ASCII em um fluxo
VF_read leia um vetor de um arquivo ASCII
VF_nwrite write n escreva n vetores do mesmo tipo de dados que as colunas de uma tabela em um fluxo
VF_nread Leia as colunas de uma tabela em n vetores do mesmo tipo
VF_store armazenar dados em formato binário
VF_recall recuperar dados em formato binário
 
As seguintes funções permitem modificar as configurações padrão de VF_write, VF_nwrite e VI_read
VF_setWriteFormat definir um determinado formato de número
VF_setWriteSeparate defina uma seqüência de separação entre elementos sucessivos, escrito por VF_write
VF_setNWriteSeparate defina uma seqüência de separação entre as colunas escritas por VF_nwrite
V_setRadix defina uma base diferente do padrão de 10 para as variantes do número inteiro das funções V..read

4.12 Gráficos

VectorLib inclui uma variedade de rotinas de traçado de dados. Antes de qualquer um deles ser usado, gráficos VectorLib devem ser inicializados:
 
V_initPlot inicialize as funções de gráficos VectorLib (Windows e DOS). Para o Windows, nenhum fim é necessário no final, uma vez que as funções gráficas do Windows permanecem sempre acessíveis. V_initPlot reserva automaticamente uma parte da tela para as operações de traçado. Esta parte compreende cerca de 2/3 da tela do lado direito. Acima, uma linha é deixada para um título. Abaixo, algumas linhas ficam vazias. Para alterar esta região de traçado padrão, ligue para V_setPlotRegion após V_initPlot.
V_initGraph Inicialize simultaneamente a interface gráfica de Borland e as funções VectorLibplotting (somente DOS).
V_initPrint inicialize as funções gráficas do VectorLib e direcione-as para uma impressora (somente para Windows). Por padrão, uma página inteira é reservada para plotar. Para alterar isso, ligue para V_setPlotRegion after V_initPrint.
V_setPlotRegion defina uma região de traçado diferente do padrão
 
VectorLib distingue dois tipos de funções de traçado, AutoPlot e DataPlot. Todas as funções AutoPlot (por exemplo, VF_xyAutoPlot) executam as seguintes etapas:
  1. defina uma viewport dentro da região de traçado (que é a região padrão ou a definida pelo chamado V_setPlotRegion)
  2. limpe a viewport
  3. gerar um sistema de coordenadas cartesianas com eixos adequadamente dimensionados e rotulados
  4. traçar os dados de acordo com os parâmetros passados ​​para a função
Todas as funções do DataPlot executam apenas o último passo. Eles assumem que um sistema de coordenadas já existe de uma chamada anterior para qualquer uma das funções AutoPlot para V_findAxes, ou para V_drawAxes. O novo gráfico é adicionado ao existente.
Para todas as funções de traçado, os diferentes estilos de plotagem (símbolos, linhas e cores) são especificados como parâmetros, veja VF_xyAutoPlot. Aqui está uma lista das rotinas AutoPlot e DataPlot disponíveis:
 
VF_xyAutoPlot exibe um gráfico de escala automática de um par de vetores
VF_yAutoPlot traçar um único Y-vector, usando o índice como eixo X
VF_xy2AutoPlot traçar dois pares de X-Y ao mesmo tempo, escalando os eixos de tal forma que ambos os vetores se encaixam no mesmo sistema de coordenadas
VF_y2AutoPlot o mesmo para dois vetores-Y, conspirados contra seus índices
VF_xyDataPlot traçar um conjunto adicional de dados X-Y
VF_yDataPlot traçar um vetor Y adicional sobre o índice
 
As matrizes complexas cartesianas são impressas no plano complexo (as partes imaginárias versus as partes reais), usando
 
VCF_autoPlot traçar um vetor complexo cartesiano
VCF_2AutoPlot traça dois vetores complexos cartesianos simultaneamente
VCF_dataPlot traçar um vetor complexo cartesiano adicional
 
É possível desenhar mais de um sistema de coordenadas em uma determinada janela na tela. A posição de cada sistema de coordenadas deve ser especificada por V_setPlotRegion. "Hopping" entre os diferentes sistemas de coordenadas e adicionar novos DataPlots depois de definir novas viewports (por exemplo, para saída de texto) é possível pelas seguintes funções:
 
V_continuePlot volte para a viewport da última parcela e restaure suas mudanças
V_getCoordSystem obtenha uma cópia dos escores e posição do sistema de coordenadas atual
V_setCoordSystem restaurar os escalões e a posição de um sistema de coordenadas; estes devem ter sido armazenados anteriormente, usando V_getCoordSystem