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) &lt;= 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) &lt;= 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 不支持非标量的主要内容,如果未能解决你的问题,请参考以下文章

Matlab标量函数的根

带有 IF 语句的向量函数的 MATLAB 返回

MATLAB通信系统建模

可以是标量或数组的值的技术术语是啥?

去编组结果?

java中matlab的audioread()或waveread()