2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Передать массив в функцию(matlab)
Сообщение19.12.2013, 03:35 


09/01/13
33
Столкнулся с тем, что нужно передать массив в функцию, на выходе функция тоже должна возвращать массив.
А вопросы следующие:
допустим есть массив mass из 10 чисел, т.е 1х10.
Как его передать в функцию?
Как обращаться к элементам массива в функции?
Последний вопрос, как сформировать выходной массив?

 Профиль  
                  
 
 Re: Передать массив в функцию(matlab)
Сообщение19.12.2013, 11:49 
Экс-модератор
Аватара пользователя


23/12/05
12064
прелесть Матлаба как раз в работе с массивами. По умолчанию, там всё кругом одни массивы. Даже отдельное число, по сути, массив 1х1. Передавайте целиком массив: и в функцию, и обратно.

например, функция $sin(x)$

Код:
x=-pi:.01:pi; //задаем массив аргументов от -пи до пи с шагом 0.01
y=sin(x); // вычисляем синус для всех значений x сразу, у - тоже массив
plot(x,y); // рисуем график функции y=sin(x)


-- Thu Dec 19, 2013 10:56:56 --

Обращаться к элементам массива например так:

Код:
x(7)// 7-ой элемент массива x
x(1:3:15) // элементы массива х с 1-го по 15-ый с шагом 3, то есть 1-ый, 4-ый, 7-ой, 10-ый, 13-ый
x([1,2,11,28]) // 1-ый, 2-ой, 11-ый и 28-ой элементы
x(length(x)/2:end-1) // элементы массива начиная с середины до предпоследнего


2-ой, 3-ий и 4-ый примеры возвращают массивы

 Профиль  
                  
 
 Re: Передать массив в функцию(matlab)
Сообщение19.12.2013, 13:29 


09/01/13
33
photon, спасибо за ответ. Я наверно некорректно задал свой вопрос.
Создается m-файл под названием funkt, допустим. Он должен принимать входные аргументы: a,b,c,d и mass-массив чисел(условно обозначим).

Код:
часть кода формирующий массивы
syms x;
t=input('Введите сигнал: ');
fun1=matlabFunction(t);
j=1;

for i=q1:shag:q2
x1(j)=i;
x2(j)=fun1(x1(j));
j=j+1;
end

Нужно передать массив чисел x2() в функцию funkt(a,b,c,d,x2()) (это неверный вызов скорее всего). В этой функции производятся действия над массивом, после всех операций функция должна вернуть измененный массив, mass2 допустим.
Затем нужно построить графики plot(x1,'массив, который вернет функция') и plot(x2,'массив, который вернет функция').
Если что-то непонятно описал, напишите. Очень нужна помощь.

 Профиль  
                  
 
 Re: Передать массив в функцию(matlab)
Сообщение19.12.2013, 13:57 
Экс-модератор
Аватара пользователя


23/12/05
12064
в Матлабе большую часть циклов можно заменить (и это будет работать в разы быстрее) операциями с массивами
Код:
j=1;
for i=q1:shag:q2
x1(j)=i;
x2(j)=fun1(x1(j));
j=j+1;
end
например сводится к двум строчкам:
Код:
x1=q1:shag:q2;
x2=fun(x1); // обратите внимание, что я подаю на вход функции целиком массив x1

Назначение части кода над циклом я не понял.
NB: $i, j$ не рекомендую использовать в качестве индексов, они зарезервированы для мнимой единицы, а вы таким образом переопределяете переменные. Лично я предпочитаю, чтобы сохранять традиции, но не занимать эти переменные использовать что-то типа $ii, jj$.


Если Вам надо передать числа $a,b,c,d$ и массив $x$, и вернуть массив mass, то так и и вызывайте
Код:
mass=funkt(a,b,c,d,x);

Функция описывается как
Код:
function [y1,...,yN] = myfun(x1,...,xM)

где $y1,...,yN$ - переменные возвращаемые функцией (в том числе это могут быть и массивы), а $x1,...,xM$ - соответствующие входные данные.

 Профиль  
                  
 
 Re: Передать массив в функцию(matlab)
Сообщение19.12.2013, 13:59 


05/09/12
2587
colding, непонятно, чем вас не устроил предыдущий ответ. Вы его читали?

Используется синтаксис Matlab M
function main()
    x1 = 1:0.1:10;
    plot(x1, funkt(10,1,5,3,x1), '-b');
    hold on
    x2 = 20:0.1:30;
    plot(x2, funkt(5,1,10,3,x2), '-r');
    hold off
    grid on
    axis equal
end

function y = funkt(a,b,c,d,x)
    y = a.*sin(b.*x) + c.*sin(d.*x);
end
 


ЗЫ пока набирал, уже ответили.

 Профиль  
                  
 
 Re: Передать массив в функцию(matlab)
Сообщение19.12.2013, 16:32 


09/01/13
33
photon,_Ivana, спасибо вам за помощь. Меня кто-то ввел в заблуждение, мол просто массив нельзя передать... короче сам повелся,сам виноват нужно было проверить:)
А задание было сделать визуализацию трех позиционного реле с зоной нечувствительности и гистерезисом.
Картинка этой нелинейности Изображение
Вот собственно код, конечно неказисто, но..:) Спасибо вам еще раз, ваш вклад большой.
в коде b1 это е-на картинке, b2-это m, c - это а.
Код:
function nelineynost
disp('Для вывода графика F(sin(x)) и входного сигнала введите 1 ');
disp('Для вывода графика F(x) и входного сигнала введите 2 ');
n=input('Ваш выбоp:');
q1=input('Введите левую границу интервала: ');
q2=input('Введите правую границу интервала: ');
disp('Введите параметры нелинейного элемента a и b (0<a<b)');
b1=input('Введите a ');
b2=input('Введите b ');
c=input('Введите значение ограничения |c| ');
syms x;
t=input('Введите сигнал: ');
fun1=matlabFunction(t);
shag=0.0001;
jj=1;
x1=q1:shag:q2;
x2=fun1(x1);
for ii=q1:shag:q2+shag
x3(jj)=fun1(ii);
jj=jj+1;
end

switch n       
    case 1
        plot(x2,hysteresis(b1,b2,c,length(x3),x3),'-b',x1,x2,':r')
        title('График нелинейности');
        xlabel('Время, с');
        ylabel('Амплитуда');
        legend('F(sinx)','входной сигнал');
        grid on;
    case 2
        plot(x1,hysteresis(b1,b2,c,length(x3),x3),'-b',x1,x2,':r')
        title('График нелинейности');
        xlabel('Время, с');
        ylabel('Амплитуда');
        legend('F(x)','входной сигнал');
        grid on;
    otherwise
        disp('miss');
end


Код:
function y=hysteresis(b1,b2,c,jj,x)
for ii=1:jj-1
dif=x(ii+1)-x(ii);
if (dif>0)               
    if (x(ii)<=-b1)         
        f=-c;         
    elseif and(x(ii)>-b1, x(ii)<b2)

        f=0;         
    elseif (x(ii)>=b2)         
        f=c;             
    end
end
if (dif<0)   
    if (x(ii)>=b1)

        f=c;               
    elseif and(x(ii)>-b2,x(ii)<b1) 
        f=0;             
    elseif (x(ii)<=-b2)                   
        f=-c;             
    end
end
y(ii)=f;
end



-- 19.12.2013, 17:39 --

_Ivana в сообщении #803433 писал(а):
colding, Вы его читали?.

Читал. Знал, что при х=0:0.1:1 и y=sin(x) создается массив у, но почему-то подумал, что так можно обращаться к стандартным функциям.

 Профиль  
                  
 
 Re: Передать массив в функцию(matlab)
Сообщение19.12.2013, 17:24 
Экс-модератор
Аватара пользователя


23/12/05
12064
Под рукой нет Матлаба - не могу проверить, как оно всё отработает, но
1)
Код:
syms x;
fun1=matlabFunction(t);

предназначены, если не ошибаюсь, для символьных вычислений. Зачем они Вам? Возможно, я просто недопонимаю задачу.
2)
Код:
for ii=q1:shag:q2+shag
x3(jj)=fun1(ii);
jj=jj+1;
end

это тоже вполне можно записать, не используя циклов.
Громоздкая реализация
Код:
function y=hysteresis(b1,b2,c,jj,x)
очевидно, также может быть сильно упрощена, если Вы будете смотреть на массив, как на единый объект и работать с ним целиком.
Например
Код:
y=diff(x)
вычисляет разности между всеми соседними элементами массива сразу, нет необходимости вытаскивать по элементу и поочередно вычислять.
Функция find() - находит сразу все элементы массива, удовлетворяющие какому-то условию
Cравнивать можно сразу массивы (равного размера или массив с числом), при этом результатом сравнения тоже будет массив (1, если результат сравнения верный и 0 в противном случае)

Не подгоняя к вашей задаче, просто как пример мощи работы с матрицами
Пусть имеется последовательность чисел x. Ко всем числам, которые больше или равны предыдущему прибавить 1, для остальных - вычесть 1.

Код:
x=x-1+2*[0 (diff(x)>=0)]

Что я тут делаю?

1) Сразу вычитаю от всех элементов массива $1$. (x=x-1)
2) Вычисляю разности между соседними элементами diff(x) и сравниваю с нулем (если разность больше или равна 0, то выполянется условие, что следующее число больше или равно предыдущему)
3) Длина массива (diff(x)>=0) на 1 меньше, чем длина исходного (и состоит этот массив из нулей и единиц), дополняю его слева нулем (поскольку мы потеряли, вычисляя разность, первый член, для которого условие не выполняется) и таким образом получаю [0 (diff(x)>=0)]
4) Домножаю на 2. 1 - чтобы компенсировать уже сделанное вычитание единицы из всех членов массива и еще 1, чтобы прибавить единицу к тем числам, к которым это прибавление надо сделать.

Тот же пример, но с числами:

пусть зададим
x = [1 2 1 4 5 6 5 3 7 10];
тогда
x-1 даст [0 1 0 3 4 5 4 2 6 9]
diff(x) даст [1 -1 3 1 1 -1 -2 4 3] (это то же самое , что x(2:end)-x(1:end-1))
diff(x)>=0 даст [1 0 1 1 1 0 0 1 1]
[0 (diff(x)>=0)] даст [0 1 0 1 1 1 0 0 1 1]
и, наконец,
x=x-1+2*[0 (diff(x)>=0)] - выдаст то, что мы ждем: [ 0 3 0 5 6 7 4 2 8 11]


Попробуйте разобраться с этим примером. Матлаб (наверное, как и любой другой язык программирования) надо немного прочувствовать, иначе вы не сможете использовать его сильные стороны и будете микроскопом заколачивать гвозди

 Профиль  
                  
 
 Re: Передать массив в функцию(matlab)
Сообщение19.12.2013, 18:04 


09/01/13
33
photon, спасибо. Впечатляет то что вы написали выше! просто была 1 лаба, чисто как ознакомление с матлабом, и выдали индивидуальное задание.
К слову,давно хотел изучить какой-нибудь мат.пакет, вещь полезная. На компьютере установлен Maple, но использую наверно 0.000001% от его возможностей, конечно, так системку решить, диф.ур решить, с комплексными числами повозится(для тау), графики.

photon в сообщении #803497 писал(а):
x=x-1+2*[0 (diff(x)>=0)]
-вот эта форма записи произвела впечатление, конечно не могу сразу судить о применение к моей задачи, т.к. нужно разобраться. Но мотивирует.
photon в сообщении #803497 писал(а):
Попробуйте разобраться с этим примером. Матлаб (наверное, как и любой другой язык программирования) надо немного прочувствовать, иначе вы не сможете использовать его сильные стороны и будете микроскопом заколачивать гвозди
5+ :)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group