Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Функция и подфункция в Матлабе
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
Muscat
Добрый день, пишу следующую модель декодера Витерби.
Имеется начальная матрица путей и весов путей. С приходом каждой новой последовательности выполняются операции преобразования внутри "бабочки" путей.
Написанный код не работает, ругается что тут объявление функции ни к месту. Если переносить функцию в другой файл, то он ссылается на несуществующие массивы, попытка добавить их в атрибуты функции приводит к ошибке - слишком много атрибутов.
Я бы хотел сделать функцию сродни функции класса в С++. Входные параметры функции - те, что меняются в процессе работы. А ссылок на используемые матрицы не делать.
Путано наверное объясняю, в общем вот код

Код
clear all;
EnCoder;%Задание изначальной матрицы
%Работа декодера сводится к следующему. Изначально задается матрица,
%в которой выбирается начальная ветвь, ошибка которой =0, ошибки остальных
%представляются равными настолько большому числу, что должны отпастьв
%процессе отбора. Далее работа разбивается на бабочки, разбивка происходит
%в ручную, как и задание параметров для каждой бабочки. Параметрами
%являются следующие X1,X2 - входные состояния, Х3-Х4 - выходные состояния
%бабочки. A- переход в бабочке между Х1-Х3 И Х2=Х4, B- переход между двумя
%другими. Далее считается суммарная метрика и выбирается минимальная,
%приходящая в узлы Х3 и Х4.
%Если приходящая в узел Х3 метрика из Х1 меньше
%чем из Х2, то берем путь (1-19), по которому до этого пришли в Х1 и
%присваиваем строке (2-20), означающей путь в Х3,а первый элемент
%собственно само значение этого состояния ( задается для всех).
%Использование временных матриц обусловленно тем, что нельзя изменять
%метрику пути, приходящую в Х3 сразу, так как в следующей бабочке эта
%информация будет использоваться для других вычислений

AA_CB=[0,0];  %Вектора переходов
BD_DC=[0,1];
BC_DD=[1,0];
AB_CA=[1,1];

%Задание исходной матрицы путей
    Path_Matrix(1:4,1:20)=0;
    Path_Matrix(1:4)=1:4;
    T_Path(1:4,1:20)=0; %временная матрица
%Задание матрицы ошибок
    Err_Matrix(1:4)=(100);
    Err_Matrix(1)=(0); %задание начальной точки (1)
    T_err(1:4)=0; %временный вектор ошибок

%----Функция выполнения операции с одной бабочкой

function Buttefly(X1,X2,X3,X4,A,B,Y)
    X1_X3= sum(abs(A-Y)); %вычисление ошибок, приходяших в точки
    X1_X4= sum(abs(B-Y));
    X2_X4=X1_X3;
    X2_X3=X1_X4;

    T_Path(1:4,1)=1:4; %В каждый узел приходит один ветвь, значит
            %окончание каждому окончанию пути соответствует одна ветвь
    if (X1_X3<X2_X3) %выбор пути для Х3
        ERR_T(X3)=X1_X3; %Вес пути присваиваем новый
        T_Path(X3,2:20)=Path_Matrix(X1,1:19);
        % элементы со второго получают значение пути, пришедшего в Х1
    else
        ERR_T(X3)=X2_X3;
        T_Path(X3,2:20)=Path_Matrix(X2,1:19);
    end

    if (X1_X4<X2_X4)
        ERR_T(X4)=X1_X4; %Вес пути присваиваем новый
        T_Path(X4,2:20)=Path_Matrix(X1,1:19);
     else
        ERR_T(X4)=X2_X4;
        T_Path(X4,2:20)=Path_Matrix(X2,1:19);
    end
end
jorikdima
Не понятно. Приведите конкретный код, который не работает.
Muscat
Декодер написал, сейчас все работает, вопрос вот какой

Есть файл VitDec.m в котором записана основная программа и который использует функцию Babochka(.....), которая вычисляет метрики путей. Соответственно для функции Babochka пришлось создать отдельный файл. Если я дописываю описание этой функции в конце основного файла, то выдается ошибка, что объявление функции здесь ни к месту. Как правильно объявить функцию внутри исполняемого m файла?
jorikdima
function main()
misc();
end

function misc()

end
Muscat
Спасибо!

И еще такой вопрос.
Я пишу функцию для собственного использования. В ней есть ряд варьируемых параметров, которые задаются аргументами функции, а есть данные, которые задаются в основной программе и не меняются для разных вызовов функции. То есть передавать их в качестве аргументов не обязательно.
Можно ли реализовать в функции прямые ссылки на данные из основной программы или другой функции, если они записаны в одном файле?

Например
Код
function main()
L=15;
D=5;
for i=1:5
y=MagicPeopleVodooPeople(i,L,D);
end

function y=MagicPeopleVodooPeople(i,L,D)
y=i*(L+D)
end


Записать в виде

Код
function main()
L=15;
D=5;
for i=1:5
y=MagicPeopleVodooPeople(i);
end

function y=MagicPeopleVodooPeople(i)
y=i*(L+D)
end

jorikdima
Код
function main()
global L D
L=15;
D=5;
for i=1:5
y=MagicPeopleVodooPeople(i);
end

function y=MagicPeopleVodooPeople(i)
global L D
y=i*(L+D)
end
Muscat
Еще раз огромное спасибо!
Muscat
Еще один вопрос из серии how to
Когда то давно читал, что в Матлабе не желательно использование циклов, а лучше все делать в матричном виде.
Есть программ, в которой по кругу выполняется цикл. Операции в каждом цикле никак не связаны с операциями в предыдушем такте работы.
Дабы не загружать вас разбором моей программы, вот пример как это выглядит
Код
function main()
A=1:3:60;
B=sin(A);
for i=1:2:20
    T(i)=sin(A(i)^2);
   %Еще какой то код....
    M(i)=B(i)^2+A(i);
end
disp(T);
disp(M);

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

Как это сделать правильно?
jorikdima
Цитата(Muscat @ Jul 9 2010, 10:01) *
Как это сделать правильно?

Критерий правильности у каждого свой smile.gif
Можно так как вы предложили, сделать функцию и дать на вход ей вектор параметров. Чтоб не передавать огромное число параметров, можно пользоваться глобальными переменными.
А можно просто работать не со скалярными величинами, а с векторами. В приведенном примере, если бы цикл был бы по каждому элементу, а не через один, это выглядело бы так:
Код
function main()
A=1:3:60;
B=sin(A);
T=sin(A.^2);
   %Еще какой то код....
M=B.^2+A;

disp(T);
disp(M);

Если инкремент через 2 принципиален, могу написать и такой код. Надо? Идея в том, чтоб создать подвектор С из вектора А, который бы содержал элементы вектора А через один. А дальше все как я показал в коде.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.