реклама на сайте
подробности

 
 
> Функция и подфункция в Матлабе, Как сделать? Модель декодера
Muscat
сообщение Jun 29 2010, 09:29
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 277
Регистрация: 8-04-09
Из: Москва
Пользователь №: 47 382



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

Код
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


--------------------
Because it's there
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Muscat
сообщение Jul 9 2010, 06:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 277
Регистрация: 8-04-09
Из: Москва
Пользователь №: 47 382



Еще один вопрос из серии 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)? Но такой вариант был бы не совсем удобным, так внутри идет обращение ко многим данным, передача их всех в качестве аргумента усложнила бы задачу.

Как это сделать правильно?


--------------------
Because it's there
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jul 9 2010, 06:36
Сообщение #3


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(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 принципиален, могу написать и такой код. Надо? Идея в том, чтоб создать подвектор С из вектора А, который бы содержал элементы вектора А через один. А дальше все как я показал в коде.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 04:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016