Matlab 编码器 - 需要一个标量。 IF 或 WHILE 不支持非标量
Posted
技术标签:
【中文标题】Matlab 编码器 - 需要一个标量。 IF 或 WHILE 不支持非标量【英文标题】:Matlab coder - Expected a scalar. Non-scalars are not supported in IF or WHILE 【发布时间】:2013-09-09 14:46:22 【问题描述】:我有以下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 数据类型并不完全熟悉,这也许是我遗漏某些东西的原因。
【问题讨论】:
size(v)
给你什么? size(max(v))
?显然,第二个表达式不是缩放器。在我的脑海中,v
可能是一个单元阵列或具有领先的单例维度。您在该行上也有语法错误。 Matlab 使用 elif
而不是 elseif。因此,这也可能会引发 mlint 循环。那么你有一个潜在的逻辑错误。 vplus
将成为一个缩放器或一个数组,具体取决于v
的内容。你的意思可能是vplus=max(v)
@KitsuneYMG:不,MATLAB 确实使用elseif
(请参阅mathworks.co.uk/help/matlab/ref/if.html 的文档),因此该行没有语法错误。但是,最好按照建议检查size(v)
和size(max(v))
。
是的,我有一些变化,因为它是一个与工作相关的项目,里面的条件程序发生了什么变化。是的,它应该是 max(v)。但是,这个编码器没有转换它,因为它不知道我认为返回的 max 的维度! vmax 是单个值,最大维度是“1 x :?” v 的大小为 1X1 到 1X3,在 getV 内部初始化为 v = []
size(v) = 1x2 并且 size(max(v)) 也是 1x2
你可以测试elseif max(v) <= 1
吗?有效 - 这样你可以确定 max(v) 的 vmax 是否是问题。
【参考方案1】:
我会说:
elseif all(max(v) <= vmax)
或
elseif max(v(:)) <= vmax
在 MATLAB 中,即使 test
不是标量,if test
也可以通过。如果test
是一个逻辑数组,如果所有元素都不为零,则它会通过。
但是,在转换为 C 时,MATLAB Coder 不支持这一点。因此,您需要通过插入 all
或将 v
与其最大值作为向量进行比较来明确确保获得标量.
【讨论】:
【参考方案2】:为什么不遵循错误消息中的建议并尝试:
elseif all(max(v) <= vmax)
在您的特殊情况下,all()
可能是多余的,但我假设编码器会尝试尊重比较可能原则上会导致数组的可能性。
【讨论】:
建议了所有函数,但它只返回零或一【参考方案3】:您可能想要测试 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
【讨论】:
这是一个混合维度的问题,有点像不同维度的向量【参考方案4】:尺寸混淆了,编译器告诉我使用all
函数,但是
我做了以下,这是修复
v = v(:);
在将其传递给 max 之前,一切都已解决
【讨论】:
【参考方案5】:我遇到了这个问题,因为我有一个可变大小的变量
if a==b
c = 1;
else
c = [1,1]
end
为了解决这个问题,我必须提前将c
定义为[0,0]
。
Matlab Coder
似乎不支持灵活大小。
【讨论】:
以上是关于Matlab 编码器 - 需要一个标量。 IF 或 WHILE 不支持非标量的主要内容,如果未能解决你的问题,请参考以下文章