Traduzione Matlab-Scilab

Strumenti informatici per la matematica applicata, le simulazioni, il disegno: Mathcad, Matlab, Scilab, Microcap, PSpice, AutoCad ...

Moderatori: Foto Utenteg.schgor, Foto Utentedimaios

Avatar utente
Foto Utentefabrileroy
10 3
New entry
New entry
Messaggi: 54
Iscritto il: 1 feb 2011, 13:22
0
voti

[31] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 28 feb 2011, 12:47

Ciao! avrei un problema: è possibile compilare una funzione .C con Scilab?
io ho una funzione.c che legge da un file tramite fread (il nome del file da leggere devo passarlo da Scilab alla funzione C). In esecuzione la funzione C scrive in un altro file chiamato output.txt. Infine la funzione Scilab deve andare a leggere il file output.txt. Come faccio a fare tutto ciò?
1) passare parametro (nome file) da scilab a C
2) compilare funzione C (come se attraverso prompt digitassi gcc funzione.c) e creazione del file .exe
3)collegamento Scilab file .exe così creato

Ho già letto il manuale e l'help di Scilab.
Thx !

Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
Messaggi: 1778
Iscritto il: 5 dic 2009, 17:37
Località: Italy Turin
0
voti

[32] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 1 mar 2011, 15:23

fabrileroy ha scritto:è possibile compilare una funzione .C con Scilab?

Detta così non ha senso, Scilab non è un compilatore C.

E' possibile caricare una libreria dinamica da Scilab e chiamare una qualsiasi funzione pubblica, questa libreria può essere scritta con un qualsiasi linguaggio che integra API di Scilab, ad esempio il C.

Nei sorgenti di Scilab ci sono gli esempi. La documentazione spiega i vari passaggi:

http://wiki.scilab.org/howto/Create_a_toolbox

API di Scilab:

http://tinyurl.com/654qlly

Anche in altri siti sono presenti esempi di moduli esterni per Scilab, basta cercare:

http://jblopen.com/node/18

Avatar utente
Foto Utentefabrileroy
10 3
New entry
New entry
Messaggi: 54
Iscritto il: 1 feb 2011, 13:22
0
voti

[33] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 1 mar 2011, 15:54

quindi mi stai dicendo che non c'è un modo più rapido e intuitivo per legare il C a Scilab? Ottimo!!! guarderò la documentazione, Thx!

Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
Messaggi: 1778
Iscritto il: 5 dic 2009, 17:37
Località: Italy Turin
0
voti

[34] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 1 mar 2011, 17:28

fabrileroy ha scritto:quindi mi stai dicendo che non c'è un modo più rapido e intuitivo per legare il C a Scilab

Mica ho detto questo, per me è rapido e intuito (parlo da programmatore). E' possibile utilizzare altri linguaggi non solo il C per scrivere moduli esterni. Ci sono metodi per generare dal codice di Scilab un modulo binario nativo. E' possibile da programmi esterni richiamare Scilab. E' tutto scritto nella documentazione basta leggerla con attenzione.

Avatar utente
Foto Utentefabrileroy
10 3
New entry
New entry
Messaggi: 54
Iscritto il: 1 feb 2011, 13:22
0
voti

[35] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 3 mar 2011, 11:14

ciao, ho letto le cose che mi hai linkato, volevo chiederti una cosa inerente al seguente link:
http://jblopen.com/node/18

ho seguito le istruzioni e il risultato è stato quello che mi aspettavo e che volevo fare.
Vorrei apportare però una modifica:
nel link postato la compilazione mediante la seguente stringa: gcc -fPIC -O2 -shared -o libfract.so fract.c
viene inserita manualmente nel compilatore (l'utente la digita), io vorrei invece che fosse Scilab a inviare la stringa al prompt per la compilazione, è fattibile una cosa del genere?

Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
Messaggi: 1778
Iscritto il: 5 dic 2009, 17:37
Località: Italy Turin
1
voti

[36] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 3 mar 2011, 13:16

fabrileroy ha scritto:compilazione mediante la seguente stringa: gcc -fPIC -O2 -shared -o libfract.so fract.c
...
io vorrei invece che fosse Scilab a inviare la stringa al prompt per la compilazione


Si puoi farlo, la solita documentazione ufficiale descrive come, puoi usare la funzione "host" ma non è la sola:

http://help.scilab.org/docs/5.3.0/en_US/host.html

Francamente io non lo fai mai, di solito per compilare i programmi si usa il comando "make" con i Makefile, ad esempio per compilare il modulo che hai segnalato io ho scritto il seguente Makefile:

Codice: Seleziona tutto

CC=gcc
CFLAGS=-fPIC -O2

all: libfract.so

libfract.so: fract.o
   $(LD) -shared -o $@ $?

fract.o: fract.c

clean:
   -rm libfract.so core *.o *~

è per me la scelta migliore per compilare programmi anche molto complessi (insieme a autoconf e automake).

Avatar utente
Foto Utentefabrileroy
10 3
New entry
New entry
Messaggi: 54
Iscritto il: 1 feb 2011, 13:22
0
voti

[37] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 3 mar 2011, 17:05

Ti ringrazio per il suggerimento, alla fine ho usato "host" visto che la funzione non era troppo articolata.

Non capisco perché quando faccio il call da scilab passando come parametro la stringa
"C:/Documents and Settings/User/Desktop/San Raffaele/Scilab/spm/nLaragione_A_MBqcc_f.hdr" e riprendendola tramite un puntatore (vedi allegato) Scilab si chiude!

Io faccio:
compilo la funzione C nel prompt con il comando gcc -fPIC -O2 -shared -o liborigin.so origin.c (oppure usando "host" in Scilab);
linko a scilab: so1 = link('liborigin.so', 'read', 'c' );
quando poi faccio il call: call('read', P, 1, 'c'); con P="C:/Documents and Settings/User/Desktop/San Raffaele/Scilab/spm/nLaragione_A_MBqcc_f.hdr"
Scilab si chiude e naturalmente non esegue la call
Allegati
nLaragione_A_MBqcc_f.zip
(786 Byte) Scaricato 142 volte

Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
Messaggi: 1778
Iscritto il: 5 dic 2009, 17:37
Località: Italy Turin
0
voti

[38] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 3 mar 2011, 22:30

Hai chiamato la funzione C col nome "read", questa funziona fa' parte delle funzioni base della libreria C fin dai tempi del primo Unix System V, quindi è meglio non usare mai nomi di funzioni presenti nella libc.

Utilizzi la funzione "exit" per uscire, può andare bene per un programma stand-one ma per una libreria dinamica di solito è meglio non usarla, visto che chiude immediatamente il programma in caso d'errore. Di solito è meglio un semplice "return".

Da quello che ho provato una funziona come l'hai concepita non funziona, serve almeno un ritorno altrimenti Scilab non genera bene la chiamata, qualcosa del tipo in C:

Codice: Seleziona tutto

void myread(int y[], char *file)
{

    *y = 0;
}


per poi chiamarla da Scilab con:

Codice: Seleziona tutto

P='nome_file';
call('myread', P, 2, "c",  "out", [1,1], 1, "i");


Scilab può generare in automatico da un sorgente C il Makefile per compilarlo è il wrapper per usare la libreria dentro Scilab con la funzione "ilib_for_link":

http://help.scilab.org/docs/5.3.0/en_US ... _link.html

Avatar utente
Foto Utentefabrileroy
10 3
New entry
New entry
Messaggi: 54
Iscritto il: 1 feb 2011, 13:22
0
voti

[39] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 4 mar 2011, 13:18

Ciao, secondo te se ho che V:
V =

fname: ""
dim: [0,0,0,0]
mat: [4x4 constant]
pinfo: [3x1 constant]
descrip: "spm - 3D normalized - conv (8,8,8)"


v:
fname: "C:\Documents and Settings\User\Desktop\San Raffaele\Scilab\spm\nLaragione_A_MBqcc_f.img"
dim: [79,95,68,4]
mat: [4x4 constant]
pinfo: [3x1 constant]
descrip: "spm - 3D normalized - conv (8,8,8)"

f:
f =

!fname !
! !
!dim !
! !
!mat !
! !
!pinfo !
! !
!descrip !


qual è l'equivalente Scilab di questa espressione di Matlab:

Codice: Seleziona tutto

for j=1:size(f,1),
      eval(['V(i).' f{j} ' = v.' f{j} ';']);
    end;


ho provato a vedere sul manual ma sinceramente non ho capito come potrei convertirla

Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
Messaggi: 1778
Iscritto il: 5 dic 2009, 17:37
Località: Italy Turin
0
voti

[40] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 4 mar 2011, 13:49

fabrileroy ha scritto:

Codice: Seleziona tutto

    for j=1:size(f,1),
          eval(['V(i).' f{j} ' = v.' f{j} ';']);
        end;

La documentazione di Scilab contiene l'equivalenza tra le funzioni di Matlab a Scilab (se possibile), "eval" di Matlab equivale al "evstr" di Scilab:

http://www.scilab.org/product/dic-mat-sci/eval.html


Torna a “Programmi applicativi: simulatori, CAD ed altro”