Matlab编码器 - 期望一个标量。 IF或WHILE不支持非标量

时间:2013-09-09 14:46:23

标签: matlab matlab-coder

我有以下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

这工作正常,但是当我尝试将其转换为matlab编码器中的c代码时,我收到以下错误: 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数据类型并不完全熟悉,也许我为什么缺少某些东西。

5 个答案:

答案 0 :(得分:4)

我会说:

elseif all(max(v) <= vmax)

elseif max(v(:)) <= vmax

在MATLAB中,即使if test不是标量,test也可以通过。如果test是一个逻辑数组,如果所有元素都不为零,它将通过。

然而,在转换为C时,MATLAB Coder不支持这一点。因此,您需要明确确保通过插入all或将v与{{1}}进行比较来获得标量最大值为向量。

答案 1 :(得分:2)

为什么不遵循错误消息中的建议并尝试:

elseif all(max(v) <= vmax)

在你的特殊情况下,all()可能是多余的,但我认为编码器试图尊重比较原则上的可能性导致数组。

答案 2 :(得分:1)

您可能希望测试visvector的矢量。

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

答案 3 :(得分:1)

维度混淆了,编译器告诉我使用all函数 我做了以下,这是修复

v = v(:); 

在将其传递给最大值之前,所有解决了

答案 4 :(得分:0)

我遇到了这个问题,因为我有一个大小灵活的变量

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

要解决此问题,我必须预先将c定义为[0,0]

Matlab Coder中似乎不支持灵活大小。