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 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

[81] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 21 mar 2011, 10:53

Ho riesaminato i sorgenti, io credevo SPM2 (il primo trovato da Google sui nomi nancanti) invece usi quello ancora più vecchio SPM99.

SPM99 ha un sistema di compilazione molto spartano basato su un script shell "spm_MAKE.sh" che hai individuato prima (non usa i Makefile).

Devi compilare n-volte lo stesso sorgente passandogli ogni volta il tipo desiderato:

Codice: Seleziona tutto

$CC -c -o utils_uchar.o      spm_vol_utils.c -DSPM_UNSIGNED_CHAR
$CC -c -o utils_short.o      spm_vol_utils.c -DSPM_SIGNED_SHORT
$CC -c -o utils_int.o      spm_vol_utils.c -DSPM_SIGNED_INT
$CC -c -o utils_schar.o      spm_vol_utils.c -DSPM_SIGNED_CHAR
$CC -c -o utils_ushort.o   spm_vol_utils.c -DSPM_UNSIGNED_SHORT
$CC -c -o utils_uint.o      spm_vol_utils.c -DSPM_UNSIGNED_INT
$CC -c -o utils_float.o      spm_vol_utils.c -DSPM_FLOAT
$CC -c -o utils_double.o   spm_vol_utils.c -DSPM_DOUBLE

# Byteswapped images
$CC -c -o utils_short_s.o   spm_vol_utils.c -DSPM_SIGNED_SHORT -DSPM_BYTESWAP
$CC -c -o utils_int_s.o      spm_vol_utils.c -DSPM_SIGNED_INT -DSPM_BYTESWAP
$CC -c -o utils_ushort_s.o   spm_vol_utils.c -DSPM_UNSIGNED_SHORT -DSPM_BYTESWAP
$CC -c -o utils_uint_s.o   spm_vol_utils.c -DSPM_UNSIGNED_INT -DSPM_BYTESWAP
$CC -c -o utils_float_s.o   spm_vol_utils.c -DSPM_FLOAT -DSPM_BYTESWAP
$CC -c -o utils_double_s.o   spm_vol_utils.c -DSPM_DOUBLE -DSPM_BYTESWAP

E' importantissima l'opzione "-o" per avere il nome diverso dal sorgente. Il file sorgente è sempre lo stesso ma viene modificato del preprocessore al volo in base ai vari "SPM_*" e genera i file oggetto compilati con le varie funzioni che ti mancano. Ad esempio la funzione "resample_uchar" che ti mancava si troverà nel file oggetto "utils_uchar.o".

Sempre lo stesso script di compilazione crea una libreria statica "spm_vol_utils.a" (il nome non rispetta le convenzioni delle librerie) con tutti i file oggetto di prima per facilitare l'uso.

Ho provato compilare tutto il sorgente ma poi io non ho Matlab (preferisco Octave, Scilab, R, e Maxima) e tutti i file di Matlab mi segnalano giustamente errore.

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

[82] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 21 mar 2011, 11:37

Ti ringrazio subito per il tempo dedicato...
tieni presente che io voglio compilare, linkare e chiamare la\e funzione\i da Scilab (e non sarà facile), non da Matlab.
Da Matlab ho provato e funziona correttamente tutto. Scilab, come dicevi giustamente tu, ha bisogno di una libreria dinamica non statica.

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

[83] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 21 mar 2011, 11:57

fabrileroy ha scritto:ha bisogno di una libreria dinamica non statica.

Certo ma no so' se vuoi usare i file oggetto separati o i file oggetti messi in una libreria statica. Nel primo caso quando crei la libreria dinamica per Scilab li passi tutti i file oggetti che contengono le funzioni mancanti, ne secondo caso basta passarli solo la libreria statica.

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

[84] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 21 mar 2011, 17:13

il problema adesso è fare la call della funzione "spm_conv_vol.c". Io come punto di ingresso per il link ho usato la funzione mexFunction in "spm_conv_vol.c":

Codice: Seleziona tutto

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

che però è funzione void e in più è definita come era definita la funzione spm_unlink.c che non riuscivo a chiamare e che ho dovuto riscrivere adattandola; solo che riscrivere questa mi sembra un po' più impegnativo :cry:
Riesco a chiamarla senza doverla riscrivere?

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

[85] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 22 mar 2011, 10:44

fabrileroy ha scritto:Riesco a chiamarla senza doverla riscrivere?

Dipende dalle tue capacità e conoscenze come programmatore. Di solito in queste cose uno deve sapere esattamente cosa gli serve, conoscere benissimo i due ambienti e scrivere il codice per adattarli.

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

[86] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 24 mar 2011, 14:32

come la chiamo la funzione spm_conv_vol.c?
contando che io voglio chiamarla dalla funzione spm_conv_vol.sci (allegata) e che la funzione spm_smooth2.sci (allegata) in ultima riga chiama spm_conv_vol.sci passando i seguenti parametri:

Codice: Seleziona tutto

P è struttura così composta:
   P.fname= "C:\Documents and Settings\User\Desktop\San Raffaele\Scilab\spm\nLaragione_A_MBqcc_f.img";
   P.dim= [79 95 68 4];
   P.mat= [2 0 0 -80; 0 2 0 -114; 0 0 2 -52; 0 0 0 1];
   P.pinfo= [0.0560362; 0; 0];
   P.descrip= "spm - 3D normalized - conv (8,8,8)";

Q è una struttura così composta:
  Q.fname= "C:\Documents and Settings\User\Desktop\San Raffaele\Scilab\spm\sssnLaragione_A_MBqcc_f.img"
  Q.dim= [79,95,68,4];
  Q.mat=[2 0 0 -80; 0 2 0 -114; 0 0 2 -52; 0 0 0 1];
  Q.pinfo= [0.0560362; 0; 0];
  Q.descrip= "spm - 3D normalized - conv (8,8,8) - conv (8,8,8)";
 
s=[1.6986436    1.6986436    1.6986436];

x = round(6*s(1)); x = [-x:x];
y = round(6*s(2)); y = [-y:y];
z = round(6*s(3)); z = [-z:z];
x = exp(-(x .^2)/(2*(s(1) .^2)));
y = exp(-(y .^2)/(2*(s(2) .^2)));
z = exp(-(z .^2)/(2*(s(3) .^2)));
x = x/sum(x);                       
y = y/sum(y);
z = z/sum(z);

i  = (length(x) - 1)/2;
j  = (length(y) - 1)/2;
k  = (length(z) - 1)/2;


Io voglio chiamare spm_conv_vol.c passando come parametri (P, Q, x, y, z, -[i, j, k]).

Tu mi hai detto che le funzioni chiamate da Scilab devono sempre essere non void e già qui abbiamo una funzione void che dovremmo far diventare int (per esempio)
Allegati
spm_conv_vol.zip
(4.72 KiB) Scaricato 191 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

[87] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 24 mar 2011, 17:56

I nomi della funzioni le sceglie chi le programma o chi scrive le specifiche, di solito hanno un nome sensato e non devono entrare in conflitto con nomi già esistenti.

Non credo di avere mai detto che le funzioni chiamate da Scilab devono avere come tipo di ritorno non void ? Al messaggio 38 la funzione è void. Al massimo ho detto che devono rispettare per forza le convezioni sui passaggi dei parametri di Scilab.

Per il resto dipende dalle tue capacità come programmatore, come ho già detto O_/

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

[88] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 25 mar 2011, 14:55

Volevo chiederti una cosa:
Con Matlab http://cnx.org/content/m12348/latest/
1)nlhs (Type = int): This paramter represents the number of "left hand side" arguments. So in my example function call, nlhs = 2 (the outputs are z0 and z1 vedi grassetto sotto).
2)plhs (Type = array of pointers to mxArrays): This parameter is the actual output arguments. As we will see later, an mxArray is MATLAB's structure for holding data and each element in plhs holds an mxArray of data.
3)nrhs (Type = int): Similar to nlhs, this paramter holds the number of "right hand side" arguments.
4)prhs (Type = const array of pointers to mxArrays): This array hold all of the pointers to the mxArrays of input data for instance, prhs[0] holds the mxArray containing x, prhs[1] holds the mxArray containing y, etc).

Se vogliamo chiamare la funzione: [z0,z1] = jasonsFunction(x,y,z); assume that x is a 2-D matrix, y is a string, and z is an integer, possiamo estrarre i dati e usarli semplicemente accedendo per esempio al valore contenuto in prhs[0] che sarebbe la nostra "x" nella chiamata di funzione precedente , prhs[1] è la nostra y ecc ecc

Anche Scilab può interagire in questo modo con la funzione C? THX

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

[89] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentefabrileroy » 25 mar 2011, 16:08

e nel caso come la passo una struttura da scilab al C? devo passare ogni singolo elemento della struttura come un array/puntatore oppure riesco a passare tutta la struttura?

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

[90] Re: Traduzione Matlab-Scilab

Messaggioda Foto Utentexyz » 25 mar 2011, 21:34

Non capisco perché guardare la documentazione di Matlab per scrivere un programma per Scilab. La documentazione ufficiale di Scilab spiega cosa si può fare e come farlo, basta leggerla (come consigliato più volte).

Non ho mai scritto del codice per il passaggio di strutture tra C e Scilab, non mi è mai servito. La documentazione è carente di esempi, in questo messaggio si accenno le funzioni da usare:

http://web.archiveorange.com/archive/v/ ... 4VK04looaP

la documentazione di Scilab spiega il resto:

http://doxygen.scilab.org/master_wg/d4/ ... tml#l01209

ignoro totalmente se poi funziona o se esiste un modo più semplice.


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