【问题标题】:MATLAB Coder: Truncating/concatenating cell arraysMATLAB Coder:截断/连接元胞数组
【发布时间】:2023-03-31 11:32:02
【问题描述】:

我正在尝试从 MATLAB 函数生成 C 代码。我必须使用元胞数组(我无法更改它)并且出现了两个问题:

1:我想截断一个单元格数组,即

arr = cell(1,n); 
% ...
arr = arr(1:m);   % with m<n

MATLAB Coder 禁止(...) 索引,所以我尝试了以下

tmp = arr;
arr = cell(1,m);
for i = 1:m
    arr{i} = tmp{i};
end

但这会引发错误,即“Matlab 无法确定 tmp{:} 的每个元素都在此行之前分配”。如果我在循环中将arr 的每个元素分配给tmp,也会发生同样的情况。

  1. 当我尝试连接两个元胞数组时会出现同样的问题。

你知道如何解决这个问题,这样 MATLAB Coder 就不会抛出任何错误。

【问题讨论】:

  • 有趣的是它不会承认tmp = arr; 是一个副本......也许核心器有时会使用一个指针并且它在这里感到困惑。你能在复制之前用tmp=cell(1,n);初始化temp吗?甚至可能为tmp = arr; 制作一个循环,而不是单行
  • 我尝试通过循环将arr 复制到tmp,但给出了相同的错误消息。
  • 包括我建议的初始化?
  • 是的,正是……

标签: matlab code-generation


【解决方案1】:

根据您使用的 MATLAB Coder 版本,您可能会收到此错误。 为了避免完整的分配检测问题,您可以键入:

arr = coder.nullcopy(cell(1,m));

但是您需要保证在分配之后您会写入每个单元格元素(您正在这样做,因为

for i = 1:m
    arr{i} = tmp{i};
end

【讨论】:

    【解决方案2】:

    您可以使用嵌入的花括号来做到这一点。

    arr_trunc = {arr{1:m}}
    

    我希望这会有所帮助。我用 Coder 对此进行了测试,没有出现错误。

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2019-07-03
      • 2017-12-03
      相关资源
      最近更新 更多