Выходные данные имеют тот же размер / класс, что и входные данные, но ошибка в типе соответствия: пользовательские уравнения должны создавать выходные данные такого же размера / формы, что и входные данные. - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь использовать пользовательскую функцию изучения разницы во времени , которую я использовал ранее. Я немного изменил его, чтобы выводить только переменную "V" по столбцам и взять один столбец "stim" с числами 1, 2, 3, 4, or 5. На основе чисел

  • это создаст матрицу 0s и что это length of the number of trials (длина стима)
  • и будет add 1 для каждого испытания в зависимости от столбца, обозначенного число в stim (1, 2, 3, 4, 5) для этого испытания (я знаю, что это не самый чистый способ сделать это, но это был единственный способ, чтобы это работало в fittype функция).

Функция выглядит следующим образом:

function model = TDFit3(x,r,alpha,g)
model = [];
% create 5 columns 0s with 1 denoting if number is present in column
% for that trial
stim = x;
X = [];
for j=1:length(stim)
    if stim(j) == 1
        X(j, :) = [1 0 0 0 0];
    elseif stim(j) == 2
        X(j, :) = [0 1 0 0 0];
    elseif stim(j) == 3
        X(j, :) = [0 0 1 0 0];
    elseif stim(j) == 4
        X(j, :) = [0 0 0 1 0];
    elseif stim(j) == 5
        X(j, :) = [0 0 0 0 1];
    end
end

% initialization
[N,D] = size(X);
w = zeros(D,1);         % weights
X = [X; zeros(1,D)];    % add buffer at end

% run Kalman filter
for n = 1:N

    h = X(n,:) - g*X(n+1,:);    % temporal difference features
    V = X(n,:)*w;               % value estimate
    rhat = h*w;                 % reward prediction
    dt = r(n) - rhat;           % prediction error
    w = w + alpha*dt*h';        % weight update
    model = [model; V];

   end
end

Функция работает независимо от подгонки кривой. Я проверил это, и он дает ожидаемый результат. Два входа и двойные переменные 139x1, а выход - двойная переменная 139x1. Они одного класса и одного размера.

Однако, когда я пытаюсь подгонять кривые, чтобы определить наилучшие коэффициенты подгонки альфа и g, как в приложении с графическим интерфейсом, так и ниже:

[xData, yData, zData] = prepareSurfaceData( stim, r, outcome );
    ft = fittype( 'TDFit3(x,y,alpha,g)', 'independent', {'x', 'y'}, 'dependent', 'z', 'coefficients', {'alpha','g'} )

Я получаю приведенную ниже ошибку каждый раз, когда пытаюсь изогнуть функцию под свои данные.

Ошибка при использовании fittype / testCustomModelEvaluation (строка 16) Custom Уравнения должны создавать выходной вектор, матрицу или массив, который является тот же размер и форма, что и входные данные. Это пользовательское уравнение не в состоянии удовлетворить это требование:

TD_Fit (х, у, альфа, г) * * тысяча тридцать две

Ошибка в fittype> iCreateFittype (строка 373) testCustomModelEvaluation (obj);

Ошибка в типе соответствия (строка 330) obj = iCreateFittype (obj, varargin {:});

Я не уверен, почему это происходит, так как я проверил размер и класс, и они одинаковы за пределами подгонки кривой или типа подгонки. Переменная «a» - это выходная переменная ниже.

Размер и класс каждой переменной

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

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

Я хотел бы иметь коэффициенты, которые соответствуют кривой, но эта ошибка предотвращает это.

...