Можете ли вы объяснить эту ошибку встроенной функции MATLAB? - PullRequest
1 голос
/ 11 августа 2009

У меня проблема с отправкой значения из GUI во встроенную функцию MATLAB (EMF) в модели Simulink. Я получаю это значение из ползунка в моем графическом интерфейсе и отправляю его в блок EMF в моей модели. Я могу подтвердить, что значение правильно передается из моего GUI в мой блок Simulink, так как я могу отображать значение с помощью блока отображения в моей модели и видеть изменение значения при изменении положения ползунка в моем GUI. Однако, я продолжаю получать эту ошибку, когда я запускаю свою модель:

Could not determine the size of this expression.

Function 'Kastl' (#18.282.283), line 14, column 1:
"f"

Это часть моего кода блока EMF:

function y = input_par(u,fstart)
  ...
  f_end = 1000;
  f = fstart:f_end; 
  ...

Ответы [ 2 ]

2 голосов
/ 12 августа 2009

Я считаю, MikeT правильно: вы не можете переопределить размер переменной во встроенной функции. Если вы посмотрите на эту страницу документации Встроенная функция MATLAB в подразделе Определение локальных переменных , там написано:

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

Вам нужно будет переделать вашу встроенную функцию так, чтобы объявленные вами переменные не меняли размер. Поскольку я не знаю, что вы впоследствии делаете с переменной f, я не смогу оказать вам больше помощи по .

В общем, если вам абсолютно необходимо для использования данных, которые изменяют размер, одним из решений является заполнение данных «мусорными» значениями для поддержания постоянного размера. Например:

MAX_ELEMS = 1000;  % Define the maximum number of elements in the vector
f = [fstart:MAX_ELEMS nan(1,fstart-1)];  % Create vector and pad with NaNs

В приведенном выше примере переменная f всегда будет иметь 1000 элементов (при условии, что значение fstart является целочисленным значением, меньшим или равным 1000). Значение NaN используется для дополнения вектора до соответствующего постоянного размера. Любой последующий код должен иметь возможность распознавать, что значение NaN должно игнорироваться. В зависимости от того, какие вычисления впоследствии выполняются во встроенной функции, могут потребоваться различные значения площадок вместо NaN (например, 0, отрицательные значения и т. Д.).

1 голос
/ 12 августа 2009

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

f = fstart:f_end;

меняет размер всякий раз, когда изменяется fstart. Я думаю, что это то, на что жалуется блок ЭДС. У меня нет простого обходного пути для этой конкретной проблемы, но, возможно, есть эквивалентный способ сделать то, что вы хотите, чтобы избежать этой проблемы.

...