1

我有以下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 编码器中将其转换为 ac 代码时,出现以下错误: 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 数据类型并不完全熟悉,也许是我遗漏了什么的原因。

4

5 回答 5

4

我会说:

elseif all(max(v) <= vmax)

或者

elseif max(v(:)) <= vmax

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

但是,当转换为 C 时,MATLAB Coder 不支持这一点。因此,您需要通过插入一个allv与其最大值作为向量进行比较,明确确保您获得一个标量。

于 2013-09-09T15:26:56.837 回答
2

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

elseif all(max(v) <= vmax)

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

于 2013-09-09T15:21:24.750 回答
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
于 2013-09-09T15:11:40.517 回答
1

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

v = v(:); 

在将其传递给最大值之前,一切都解决了

于 2013-09-09T15:24:45.713 回答
0

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

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

为了解决这个问题,我必须c提前定义为[0,0].

似乎Matlab Coder不支持灵活尺寸。

于 2018-10-23T09:00:07.520 回答