2014 dxdy logo

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

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




 
 Передать массив в функцию(matlab)
Сообщение19.12.2013, 03:35 
Столкнулся с тем, что нужно передать массив в функцию, на выходе функция тоже должна возвращать массив.
А вопросы следующие:
допустим есть массив mass из 10 чисел, т.е 1х10.
Как его передать в функцию?
Как обращаться к элементам массива в функции?
Последний вопрос, как сформировать выходной массив?

 
 
 
 Re: Передать массив в функцию(matlab)
Сообщение19.12.2013, 11:49 
Аватара пользователя
прелесть Матлаба как раз в работе с массивами. По умолчанию, там всё кругом одни массивы. Даже отдельное число, по сути, массив 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 
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 
Аватара пользователя
в Матлабе большую часть циклов можно заменить (и это будет работать в разы быстрее) операциями с массивами
Код:
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 
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 
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 
Аватара пользователя
Под рукой нет Матлаба - не могу проверить, как оно всё отработает, но
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 
photon, спасибо. Впечатляет то что вы написали выше! просто была 1 лаба, чисто как ознакомление с матлабом, и выдали индивидуальное задание.
К слову,давно хотел изучить какой-нибудь мат.пакет, вещь полезная. На компьютере установлен Maple, но использую наверно 0.000001% от его возможностей, конечно, так системку решить, диф.ур решить, с комплексными числами повозится(для тау), графики.

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

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group