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