Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практикум по матлабу.pdf
Скачиваний:
156
Добавлен:
29.03.2015
Размер:
1.19 Mб
Скачать

Функция Действие

fscanf

читать данные из файла по формату

F.Компиляция файлов MATLAB

MATLAB - язык, ориентированный на работу с матрицами. Вычисления, которые удается записать в матричном виде, выполняются достаточно быстро. Однако векторизовать программу удается не всегда, а в этом случае MATLAB будет проигрывать в скорости языкам более низкого уровня, например С.

Существует несколько способов ускорить вычисления:

перевести текстовые m-файлы в p-файлы, содержащие внутренний код MATLAB

(pcode)

откомпилировать m-файлы в dll-библиотеки (mcc)

написать наиболее медленные части программы в виде функций на С или Фортране, откомпилировать их в dll-библиотеки и вызывать из MATLAB.

F.1. Использование команды pcode

Этот способ дает выигрыш в скорости, если программа очень длинная или имеется много вызовов различных функций в m-файлах. Если в программе многократно вызывается одна и та же функция, то она переводится в p-файл при первом вызове и хранится в этом виде для будущих вызовов. В этом случае выигрыш в скорости будет мал. Возможные форматы вызова:

pcode file1 (file2 ...) переводит file1.m в file1.p и т.д., file1.m может находиться в любой директории, путь на которую указан в pathdef.m, file1.p создается в текущей директории

pcode *.m переводит все m-файлы в текущей директории в p-файлы

pcode file1 (file2 ...) -inplace создает p-файл в той же директории, где был m-файл.

F.2. Использование команды mcc

Второй способ позволяет перевести функции MATLAB в исполняемый код, что позволяет ускорить программу на 20-40%. Кроме того, полученную dll-библиотеку можно использовать в любом языке: например, вызывать графические функции

102

MATLAB из программы на С или Фортране. Для компиляции m-файлов необходимы:

компилятор С, поддерживающий создание dll-библиотек (Borland C/C++ 5.x, Microsoft Visual C++ 4.2 или 5.0, Watcom C/C++ 10.6 или 11)

MATLAB Compiler (необходимо указать при установке MATLAB)

Команда mcc с различными ключами также позволяет перевести m-файл в С- файл, откомпилировать программу MATLAB в исполняемый файл (который можно будет выполнять на компьютерах, где MATLAB не установлен), и др.

F.3. Использование команды mex

Третий способ не имеет прямого отношения к MATLAB. Можно написать любую функцию на С (или Фортране), включить ее в dll-библиотеку, а затем вызывать из MATLAB. Для создания dll-библиотеки необходимо кроме самой функции на С написать еще одну функцию, передающую входные аргументы вызывающей программы в функцию и возвращающую выходные аргументы вызывающей программе. При этом файл с программой на С (timestwo.c) имеет следующий формат:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#include "mex.h"

/*

*timestwo.c - пример взят из API-guide

*Функция умножает скаляр на 2.

*

*Это MEX-file для MATLAB.

*Copyright (c) 1984-1998 The MathWorks, Inc. */

/* $Revision: 1.5 $ */

void timestwo(double y[], double x[])

{

y[0] = 2.0*x[0];

}

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

{

103

double *x,*y; int mrows,ncols;

/* Check for proper number of arguments. */ if(nrhs!=1)

{

mexErrMsgTxt("One input required.");

}

else if(nlhs>1)

{

mexErrMsgTxt("Too many output arguments");

}

/* The input must be a noncomplex scalar double.*/ mrows = mxGetM(prhs[0]);

ncols = mxGetN(prhs[0]);

if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1) ) {

mexErrMsgTxt("Input must be a noncomplex scalar double.");

}

/* Create matrix for the return argument. */

plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL);

/* Assign pointers to each input and output. */ x = mxGetPr(prhs[0]);

y = mxGetPr(plhs[0]);

/* Call the timestwo subroutine. */ timestwo(y,x);

}

Здесь описана функция timestwo, умножающая число на два, и функция mexFunction, которая принимает входной аргумент x и возвращает выходной y. Аргументами последней являются:

nlhs - число выходных аргументов dll-функции

nrhs - число входных аргументов

*plhs[ ] - массив указателей на первые элементы выходных аргументов

*prhs[ ] - массив указателей на первые элементы входных аргументов.

104

Имеется множество функций для передачи переменных разнообразных типов и вывода сообщений (например mxGetPr и mxGetPi - для получения указателей на реальную и мнимую часть входного массива, mxGetString - для получения указателя на строку, mxGetN и mxGetM для получения размеров массива, mxCreateNumericArray,

mxCreateDoubleMatrix, mxCreateString - для задания указателей на массивы, матрицы и строки, и т.д. Полный список можно посмотреть в файле

\matlab5.2\help\techdoc\AP IREF \AP IREF T OC.HT ML

Если откомпилировать этот файл, то функцию timestwo можно будет вызывать из MATLAB. Формат вызова mex:

mex -setup необходимо запускать после установки нового компилятора С (или фортрана), а также один раз после установки MATLAB.

mex file компилирует file.c и создает file.dll.

Различные дополнительные ключи можно узнать, набрав help mex в окне MATLAB.

105