Кодер Matlab - ожидается скаляр. Нескаляры не поддерживаются в IF или WHILE.

У меня есть следующий код Matlab v - это массив одного измерения.

v = getV(x,y,z);
if isempty(v)
    fail_code = 1;
elseif max(v) <= vmax % <============== error is here
    fail_code = 0;
    vplus = max(v);
else
    vplus = vmax;
end

это работает нормально, однако, когда я пытаюсь преобразовать его в код c в кодере Matlab, я получаю следующую ошибку: Expected a scalar. Non-scalars are not supported in IF or WHILE statements, or with logical operators. Instead, use ALL to convert matrix logicals to their scalar equivalents.

Я не совсем знаком с типами данных Matlab, может быть, поэтому я что-то упускаю.


person aah134    schedule 09.09.2013    source источник
comment
что вам дает size(v)? size(max(v))? Очевидно, что второе выражение не является скейлером. На мой взгляд, возможно, что v является массивом ячеек или имеет ведущие одноэлементные измерения. У вас также есть синтаксическая ошибка в этой строке. Matlab использует elif, а не elseif. Так что это тоже может быть зацикливание на млинте. ТОГДА у вас есть потенциальная логическая ошибка. vplus будет либо скалером, либо массивом в зависимости от содержимого v. Вы, вероятно, имели в виду vplus=max(v)   -  person KitsuneYMG    schedule 09.09.2013
comment
@KitsuneYMG: нет, MATLAB использует elseif (см. документ на mathworks. co.uk/help/matlab/ref/if.html), поэтому в этой строке нет синтаксической ошибки. Однако было бы неплохо проверить size(v) и size(max(v)), как было предложено.   -  person am304    schedule 09.09.2013
comment
да, у меня были некоторые изменения, потому что это проект, связанный с работой, какие внутренние процедуры условий были изменены. и да, это должно быть max (v). однако этот кодер не преобразует его, потому что, я думаю, он не знает размерность того, что возвращает max! vmax — это одно значение, а максимальный размер равен 1 x :? и размер v составляет от 1X1 до 1X3, инициализируется внутри getV для v = []   -  person aah134    schedule 09.09.2013
comment
размер (v) = 1x2 и размер (max (v)) также был 1x2   -  person aah134    schedule 09.09.2013
comment
Вы можете проверить, если elseif max(v) <= 1? работает - таким образом вы можете убедиться, что vmax из max(v) является проблемой.   -  person sebastian    schedule 09.09.2013


Ответы (5)


я бы поставил:

elseif all(max(v) <= vmax)

or

elseif max(v(:)) <= vmax

В MATLAB if test может пройти, даже если test не является скаляром. Если test является массивом логических элементов, он пройдет, если все элементы отличны от нуля.

Однако это не поддерживается MATLAB Coder при преобразовании в C. Таким образом, вам нужно будет явно убедиться, что вы получаете скаляр, либо вставив all, либо сравнив v с его максимумом как вектор.

person Sam Roberts    schedule 09.09.2013

Почему бы не последовать совету в сообщении об ошибке и не попробовать:

elseif all(max(v) <= vmax)

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

person sebastian    schedule 09.09.2013
comment
была предложена вся функция, однако она просто возвращает нули или единицы - person aah134; 09.09.2013

Возможно, вы захотите проверить, является ли v вектором с isvector.

if isvector(v)
  %true case
  vplus = max(v); % returns a scalar
  vplus(vplus>= vmax) = vmax;
else
  %false case (matrix)
  error('something wrong - v dimension');
end
person marsei    schedule 09.09.2013
comment
это была проблема смешанного измерения, так что это похоже на вектор в другом измерении - person aah134; 09.09.2013

измерение перепуталось, компилятор сказал мне использовать функцию all, однако я сделал следующее, и это было исправлением

v = v(:); 

перед тем, как передать его на макс, и все решилось

person aah134    schedule 09.09.2013

У меня возникла эта проблема, так как у меня есть переменная с гибким размером, как

if a==b
c = 1;
else
c = [1,1]
end

Чтобы решить эту проблему, я должен заранее определить c как [0,0].

Кажется, в Matlab Coder гибкий размер не поддерживается.

person BonieSV    schedule 23.10.2018