Как объединить две функции в MATLAB? - PullRequest
0 голосов
/ 12 июня 2018

У меня есть две функции в моем коде MATLAB, и я хочу, чтобы вывод одной функции использовался как ввод другой функции.Как я могу это реализовать?

medianfilter1.m

Код:

function ans = medianfilter(angstanding)
[m,n] = size(angstanding);
ans = zeros(m,n);
x = angstanding(:,1);
y = angstanding(:,2);
z = angstanding(:,3);
svm = angstanding(:,4);

ans(:,1) = medfilt1(x);
ans(:,2) = medfilt1(y);
ans(:,3) = medfilt1(z);
ans(:,4) = medfilt1(svm);

Вторая функция: windowing.m

Код:

function [wx,wy,wz,wsvm] = windowing(currentdata)


% i = 1;
% obseen = 128;

 [r,c] = size(currentdata);

%  display(r);
% while obseen <= r
%     i = i +1;
%     obseen = obseen + 64;
%     
%   
% end;
% display(i);
residue  = rem((r - 128),64);
rows = floor((r-128)/64);

rows = rows + 1;


 wx = zeros(rows,128);

 wy = zeros(rows,128);
 wz = zeros(rows,128);
 wsvm = zeros(rows,128);

vectorx = currentdata(:,1);
vectory = currentdata(:,2);
vectorz = currentdata(:,3);
vectorsvm = currentdata(:,4);

for i = 1:rows
    x = (64 * (i-1)) + 1;
    if i ~= rows
        lastj = 128;
    else 
        break ;
    end;

        for j = 1:lastj

                wx(i,j) = vectorx(x);
                wy(i,j) = vectory(x);
                wz(i,j) = vectorz(x);
                wsvm(i,j) = vectorsvm(x);
                x = x + 1;

        end;


end;

и я хочу, чтобы результат medianfilter.m был передан в windowing.m.

Ниже я попробовал: merge.m

function ans = medianfilter(rawdataset_train_acc)
[m,n] = size(rawdataset_train_acc);
ans = zeros(m,n);
x = rawdataset_train_acc(:,1);
y = rawdataset_train_acc(:,2);
z = rawdataset_train_acc(:,3);
svm =rawdataset_train_acc(:,4);

ans(:,1) = medfilt1(x);
ans(:,2) = medfilt1(y);
ans(:,3) = medfilt1(z);
ans(:,4) = medfilt1(svm);

function [wx,wy,wz,wsvm] = windowing(ans)


% i = 1;
% obseen = 128;

 [r,c] = size(ans);

%  display(r);
% while obseen <= r
%     i = i +1;
%     obseen = obseen + 64;
%     
%   
% end;
% display(i);
residue  = rem((r - 128),64);
rows = floor((r-128)/64);

rows = rows + 1;


 wx = zeros(rows,128);

 wy = zeros(rows,128);
 wz = zeros(rows,128);
 wsvm = zeros(rows,128);

vectorx = ans(:,1);
vectory = ans(:,2);
vectorz = ans(:,3);
vectorsvm = ans(:,4);

for i = 1:rows
    x = (64 * (i-1)) + 1;
    if i ~= rows
        lastj = 128;
    else 
        break ;
    end;

        for j = 1:lastj

                wx(i,j) = vectorx(x);
                wy(i,j) = vectory(x);
                wz(i,j) = vectorz(x);
                wsvm(i,j) = vectorsvm(x);
                x = x + 1;

        end;


end;

Я пытался выше, но не достиг того, чего хотел.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я не совсем понимаю, что вы пытаетесь.Мне кажется, что вы действительно хотите составную функцию.

Когда у вас есть прототип / определение функции, вы должны вызвать его.

Например, если у вас есть функции для вычисления куба и квадрата числа (cubeExample и squareExample соответственно)и вы хотите вычислить шестую степень числа x:

result = squareExample(cubeExample(x))

function r = squareExample(a)
    r = a*a;
end

function r = cubeExample(a)
    r = a*a*a;
end

Также обратите внимание, что имена определений функций mute , что означает, что на самом деленезависимо от того, как вы их называете.

В этом случае было бы что-то вроде

[wx,wy,wz,wsvm] = windowing(medianfilter(angstanding))

, следуя вашим идеям, предполагая, что формат ввода окна такой же, как и выход медианного фильтра.

0 голосов
/ 12 июня 2018

Если у вас есть одна функция [output_a]=a(input) и функция [output_b] =b(input), вы можете просто сложить их, как @zizy archer уже рекомендовал. Это будет выглядеть так:

sample_input=3;    
sample_ouput_var=a(b(sample_input));

то, что делает этот блок,взятие входного сигнала сэмпла в b (), взятие выходного сигнала b и непосредственная подача его в a.так в псевдокоде:

sample_input=3;
sample_outputb=b(sample_input):
sample_outputa=a(sample_output_b):

В вашем особом случае я бы сделал это так:

outa,outb, outc, outd =windowing(medianfilter(input))

Если вы хотите объединить две функции, я бы взял вывод второй функции иввод первого, поэтому в псевдокоде это будет

function output1=examplefunc(input1):
      output1=input1*input1
end

и вторая функция

function output2=examplefunc2(input2):
     output2=input2+input2;
end

объединить их с помощью:

function outputmerged=merged_func(input1):
   output1=input1*input1;
   input2=output1;
   output_merged=input2+input2;
end

в вашем кодепример выглядит так:

function [wx,wy,wz,wsvm] = medianfilter_windowing_merge(rawdataset_train_acc)
%input from medianfilter output from windowing
[m,n] = size(angstanding);
ans = zeros(m,n);
x = angstanding(:,1);
y = angstanding(:,2);
z = angstanding(:,3);
svm = angstanding(:,4);

ans(:,1) = medfilt1(x);
ans(:,2) = medfilt1(y);
ans(:,3) = medfilt1(z);
ans(:,4) = medfilt1(svm);

%here happens the handover from one function to the other everything above is from the medianfilter.m everything below is from windowing 
currentdata=ans

[r,c] = size(currentdata);


residue  = rem((r - 128),64);
rows = floor((r-128)/64);

rows = rows + 1;


 wx = zeros(rows,128);

 wy = zeros(rows,128);
 wz = zeros(rows,128);
 wsvm = zeros(rows,128);

vectorx = currentdata(:,1);
vectory = currentdata(:,2);
vectorz = currentdata(:,3);
vectorsvm = currentdata(:,4);

for i = 1:rows
    x = (64 * (i-1)) + 1;
    if i ~= rows
        lastj = 128;
    else 
        break ;
    end;

        for j = 1:lastj

                wx(i,j) = vectorx(x);
                wy(i,j) = vectory(x);
                wz(i,j) = vectorz(x);
                wsvm(i,j) = vectorsvm(x);
                x = x + 1;

        end;


end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...