我有以下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数据类型并不完全熟悉,也许我为什么缺少某些东西。
答案 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)
您可能希望测试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
答案 3 :(得分:1)
维度混淆了,编译器告诉我使用all
函数
我做了以下,这是修复
v = v(:);
在将其传递给最大值之前,所有解决了
答案 4 :(得分:0)
我遇到了这个问题,因为我有一个大小灵活的变量
if a==b
c = 1;
else
c = [1,1]
end
要解决此问题,我必须预先将c
定义为[0,0]
。
在Matlab Coder
中似乎不支持灵活大小。