terça-feira, 28 de julho de 2009

Tutorial Scilab - 8 [Usando arquivos]

[English version here.]

Quanto tempo hein? Mas finalmente estou retomando os meus compromissos (dentre eles, o MultiSign).

Pois bem, vamos ver algo sobre manipulação de arquivos com o Scilab agora.

No Scilab, existem diversas funções para manipular arquivos tanto arquivos ASCII quanto binários.

Os aquivos são importantes para melhor gerenciar dados de entrada e resultados obtidos (óbvio não acham?).

Como a maioria deve saber o que é um arquivo, vamos dar continuidade ao post.

Uma boa forma de conhecer as formas de manipulação de arquivos no Scilab é com o help, olhe como acessar o help na figura abaixo:


Na tela de ajuda, digite: file manage e selecione a primeira opção file(.).

Esta função é semelhante à função fopen(.) da linguagem C.

No help, é possível ver várias informações sobre a função file(.).

Algumas das outras funções funções de manipulação de arquivos no Scilab são:

  • save;
  • load;
  • mopen;
  • mclose;
  • writeb;
  • readb.
No momento, vamos nos limitar as funções:

  • read;
  • write.

A função write(.) cria arquivos ASCII e a função read(.) carrega os arquivos em variáveis.

As variáveis envolvidas nestas funções geralmente são matrizes e/ou vetores. Vamos aos exemplos agora:


-->x = rand(5,5)
x =

0.2113249 0.6283918 0.5608486 0.2320748 0.3076091
0.7560439 0.8497452 0.6623569 0.2312237 0.9329616
0.0002211 0.6857310 0.7263507 0.2164633 0.2146008
0.3303271 0.8782165 0.1985144 0.8833888 0.312642
0.6653811 0.0683740 0.5442573 0.6525135 0.3616361

-->write("test_data.dat", x);

-->y1 = read("test_data.dat", 1, 2) // 1 linnha e 2 colunas
y1 =

0.2113249 0.6283918

-->y2 = read("test_data.dat", 2, 2) // 2 linhas and 2 colunas
y2 =

0.2113249 0.6283918
0.7560439 0.8497452

-->y3 = read("test_data.dat", -1, 1) // -1 indica que se deve ler todas as linhas
y3 =

0.2113249
0.7560439
0.0002211
0.3303271
0.6653811

-->>y4 = read("test_data.dat", -1, 5) // lê o arquivo inteiro
y4 =

0.2113249 0.6283918 0.5608486 0.2320748 0.3076091
0.7560439 0.8497452 0.6623569 0.2312237 0.9329616
0.0002211 0.6857310 0.7263507 0.2164633 0.2146008
0.3303271 0.8782165 0.1985144 0.8833888 0.312642
0.6653811 0.0683740 0.5442573 0.6525135 0.3616361


O arquivo test_data.dat é apresentado na figura a seguir (clique na figura para vê-la em tamanho real).

sexta-feira, 3 de julho de 2009

Nota aos leitores

Acredito que os leitores do MultiSign devem ter percebido que as postagens estão "meio atrasadas".

Eu estou com algumas atividades no momento que estão tomando muito tempo e eu também tenho outros blogs (Using Scilab, Engenheiro Católico e Catholic Engineer) os quais têm me dado muita satisfação, pois os leitores estão sempre interagindo com comentários e e-mails.

Espero estar renormalizando o MultiSign na próxima semana.

Abraços a todos e que Deus os abençoe.

quinta-feira, 4 de junho de 2009

Uma questão de energia

Eu me lembrei de um problema interessante de física.

Gostaria de verificar o potencial dos leitores do MultiSign.

Pois bem, o problema é o seguinte:

Pegue uma mola e comprima-a ao máximo.

Coloque a mola comprimida em um suporte que não permita que a mola volte à posição de relaxamento e depois mergulhe tudo em um ácido.

Este esperimento deve ser feito usando um ácido que dissolva o material da mola mas que o suporte não sofra danos.

A pergunta: para onde vai a energia contida na mola (kx²/2)?


--------------
A solução mais inteligente pode ganhar um prêmio.

sábado, 30 de maio de 2009

Top Blog

Hoje eu tive uma surpresa ao abrir minha caixa de e-mails. Vi que o MultiSign havia sido indicado ao Top Blog.

Então eu pensei, se os meu leitores não comentam quase nenhum post, alguns poucos entram em contato por messenger ou e-mail. Eu agradeço os que interagem, mas vocês sabem qual a realidade do MultiSign.

Eu fiquei até pensando se não seria uma boa inscrever o MultiSign, mas resolvi avisar aos leitores e ver a reação.

Se a resposta for positiva, eu faço a inscrição.


Se não tiver resposta, enfim é assim mesmo, não irei deixar de atualizar o blog.

sábado, 16 de maio de 2009

Desafio 01

Eu estava pensando umas coisas esses dias e acabei por me lembrar da época de ensino médio, em que eu participava das olimpíadas de física e matemática.

Haviam tantos problemas interessantes. Eu sei que a maioria das pessoas não valoriza os problemas clássicos da matemática, por exemplo, mas estudá-los e tentar resolver os problemas da base do conhecimento abre a mente para aprender cada vez mais, e, além do benefício pessoal, também é possível que outras pessoas usem suas idéias para resolver outros problemas.

Eu mesmo já usei conceitos de teoria dos números, algo que é da base da matemática, para resolver problemas em processamento de sinais e imagens.

Uma vez meu primeiro professor de cálculo disse: "o único conhecimento que você não usa é aquele que você não possui", e isso é verdade.

Eu vou então propor o problema que eu me lembrei enquanto almoçava na 4ª feira desta semana:

Você tem 1001 bolinhas e uma balança de pratos (que serve para comparar dois pesos e determinar o mais leve).
Uma destas bolinhas tem uma massa diferente das outras 1000 bolinhas.

Como determinar se a massa desta bolinha, que é diferente das outras, é maior ou menor que a massa das outras bolinhas usando a balança, no máximo, duas vezes?

---------------------------

Se os leitores se mostrarem interessados por esta minha iniciativa, eu pensei em recompensar as soluções. Talvez transferências para contas corrente sejam interessantes.

Quem tiver uma solução, favor compartilhá-la conosco fazendo um comentário neste post.

quarta-feira, 6 de maio de 2009

Tutorial Scilab - 7 [Operações elemento a elemento]

[English version here.]

Estão vendo como é difícil atualizar o MultiSign e escrever a dissertação? Mas assim que possível iremos regularizar a situação.

Vamos abordar as operações elemento a elemento usando o Scilab.

Este post será basicamente de exemplos.

Vamos supor que temos duas matrizes de mesmo tamanho (X e Y) e queremos multiplicar (Z1) e dividir (Z2) os elementos correspondentes:

X = [x11 x12 x13;
x21 x22 x23;
x31 x32 x33].

Y = [y11 y12 y13;
y21 y22 y23;
y31 y32 y33].

Z1 = [x11*y11 x12*y12 x13*y13;
x21*y21 x22*y22 x23*y23;
x31*y31 x32*y32 x33*y33].

Z2 = [x11/y11 x12/y12 x13/y13;
x21/y21 x22/y22 x23/y23;
x31/y31 x32/y32 x33/y33].

Não existe um operador matemático matricial para tal operação, mas o Scilab tem um recurso para fazer isso. Observem a seguir.

-->X = zeros(3,3);

-->X(:) = [1:9]'
X =

1. 4. 7.
2. 5. 8.
3. 6. 9.

-->Y = ones(3,3) + X'
Y =

2. 3. 4.
5. 6. 7.
8. 9. 10.

-->Z1 = X.*Y
Z1 =

2. 12. 28.
10. 30. 56.
24. 54. 90.

-->Z1 = X./Y
Z1 =

0.5 1.3333333 1.75
0.4 0.8333333 1.1428571
0.375 0.6666667 0.9

As operações de soma e subtração matriciais operam elemento a elemento.


Operações lógicas

Agora vamos fazer operações lógicas com matrizes.

Os operadores:

  • & - AND;
  • | - OR;
  • ~ - NOT.
E um código de exemplo:

-->X = rand(3,3) > 0.2
X =

F T T
T F T
T T T

-->Y = rand(3,3,'normal') > 0.5
Y =

T T F
T F T
F F F

-->Z1 = X & Y
Z1 =

F T F
T F T
F F F

-->Z2 = X | Y
Z2 =

T T T
T F T
T T T

-->Z3 = ~X
Z3 =

T F F
F T F
F F F

-->Z4 = (~X) | Y
Z4 =

T T F
T T T
F F F

Com isso, fechamos a parte de operações matriciais básicas.

sexta-feira, 17 de abril de 2009

Tutorial Scilab - 6 [Vetores e Matrizes - 4]

[English version here.]

Primeiro gostaria de me explicar com os leitores do MultiSign. Eu passei estes dias (quase 3 semanas) sem fazer nenhuma postagem porque estava envolvido com as atividades da Semana Santa, festas pascais e um artigo que espero finalizar hoje.

Voltando ao assunto. Vamos ver agora como fazer operações lógicas com vetores e matrizes.

Um exemplo:

Vamos supor que o vetor a seguir corresponde a altura, em metros, de um conjunto de pesoas.

v = [1.55 1.82 1.48 1.71 1.62 1.94 2.00]'

Precisamos então identificar as pessoas que têm mais de 1,80m.

Uma solução direta é analizar elemento por elemento:

v(1) > 1.80
v(2) > 1.80
v(3) > 1.80
v(4) > 1.80
v(5) > 1.80
v(6) > 1.80
v(7) > 1.80

Mas o Scilab tem uma forma mais prática de fazer isso:

v > 1.8 // esta operação não depende da dimensionalidade ou tamanho do vetor

Vamos fazer um script.

-->v = [1.55 1.82 1.48 1.71 1.62 1.94 2.00]'
v =

1.55
1.82
1.48
1.71
1.62
1.94
2.

-->v > 1.8
ans =

F
T
F
F
F
T
T

Mas, se o que desejamos é saber a posição dos elementos (pessoas) com mais de 1,80m:

-->pos = find(v > 1.8)
pos =

2. 6. 7.

Os elementos em v que são maiores que 1,80 são o segundo (1,82), sexto (1,94) e sétimo (2,00).

Podemos fazer a mesma coisa com matrizes.

Um exemplo muito útil é criar uma matriz binária em que a probabilidade de um elemento ser 0 (zero) é a mesma dele ser 1 (um).

Olhem o script e me dêem um feedback.

-->x = rand(3, 3)
x =

0.5667211 0.0568928 0.7279222
0.5711639 0.5595937 0.2677766
0.8160110 0.1249340 0.5465335

-->y = x > 0.5
y =

T F T
T T F
T F T

Para instigá-los, eu pergunto por que tem tantos T's a mais que F's?

terça-feira, 31 de março de 2009

Mais uma etapa chegando ao fim...

Como os leitores já devem ter percebido, estou postando com baixa frequência.

O motivo é o meu mestrado que está chegando ao fim, e como todo final de curso que se preze estou com muito o que fazer.

Minha previsão é terminar o mestrado em julho (com a defesa da minha dissertação).

Enquanto estou ocultado com as atividades do mestrado, não poderei dar a devida atenção aos meus blogs.

Espero contar com a compreensão de todos e que Deus esteja conosco hoje e sempre.

quinta-feira, 19 de março de 2009

Mathematical Morphology using OpenCV

I did a post about mathematical morphology, I wrote about theory of mathematical morphology.

Now, I want to write about the functions of OpenCV* for manipulate the structural element and apply the operations of erosion and dilatation.

The following function creates the structural element:

IplConvKernel* cvCreateStructuringElementEx( int cols,
int rows,
int anchor_x,
int anchor_y,
int shape,
int* values=NULL );

cols: Number of columns of the structural element

rows: Number of rows of the structural element

anchor_x: Horizontal offset relative to point of anchor, normally equal to 0 (zero)

anchor_y: Vertical offset relative to point of anchor, normally equal to 0 (zero)

shape: Type of structural element, possible values:
  • CV_SHAPE_RECT, square element;
  • CV_SHAPE_CROSS, element in disc;
  • CV_SHAPE_ELLIPSE, elliptic element;
  • CV_SHAPE_CUSTOM, element defined by user. In this case, the parameter values specifies the mask, delimiting the vicinity of the pixel in analysis.
values: Pointer to structural element defined by usuer, this parameter is used just for shape = CV_SHAPE_CUSTOM.

Function of erosion:

void cvErode( const CvArr* src, CvArr* dst,
IplConvKernel* element=NULL, int iterations=1 );

Function of dilatation:

void cvDilate( const CvArr* src, CvArr* dst,
IplConvKernel* element=NULL, int iterations=1 );

src: Input image;
dst: Output image;
element: Structural element. If it's NULL, the structural element is a square 3x3;
iterations: Number of times for apply the operation.
The interfaces for development in Python is the same, and all functions are very fast because they're implemented in C.

More informations here.


----------------------
* OpenCV (Open Computational Vision) is a API for development using Computational Vision. It's a very powerful set of functions for capture, processing and showing of images and videos.

quarta-feira, 18 de março de 2009

Carro voador "popular"

Olhe o novo desejo que iremos ter aqui.

Nada mais de engarrafamentos, trânsito lento, ruas esburacadas, pneus furados, etc...

Basta mudar seu carro convencional por um SKYCAR.

Segue um vídeo do produto.



Vale lembrar que é necessário um brevê para pilotar o SKYCAR.