主要内容

coder.findOrError

在生成的 C/C++ 代码中查找数组中非零元素的索引和值

自 R2026a 起

说明

k = coder.findOrError(X,n) 返回与数组 X 中非零元素对应的前 n 个线性索引。如果您仅提供 X 参量,coder.findOrErrorn 使用默认值 1

  • 如果 X 是向量,则 k 是方向与 X 相同的向量。

  • 如果 X 是多维数组,则 k 是列向量。

  • 如果在代码生成时 X 是可变大小矩阵,而在运行时是行向量,则生成的 MEX 函数的输出是列向量,而不是行向量。

在 MATLAB® 执行中,如果数组 X 包含的非零元素少于 n 个,则 coder.findOrError 的行为与 find 相同。对于此类输入,代码生成会产生编译时或运行时错误。

注意

与在代码生成中始终返回可变长度向量的 find 函数不同,如果在代码生成期间参量 n 是常量,则 coder.findOrError 函数返回具有固定长度 n 的向量。如果数组 X 包含的非零元素少于 n 个,则 coder.findOrError 会产生编译时或运行时错误。

示例

k = coder.findOrError(X,n,direction)(其中 direction'last')查找与 X 中非零元素对应的最后 n 个索引。direction 的默认值为 'first',它查找与非零元素对应的前 n 个索引。

示例

[row,col] = coder.findOrError(___) 使用上述语法中的任何输入参量,返回数组 X 中非零元素的行和列下标。

[row,col,v] = coder.findOrError(___) 还返回向量 v,其中包含 X 的非零元素。

示例

示例

全部折叠

在此示例中,您查找固定大小矩阵中前 n 个非零元素的线性索引,其中 n 在代码生成期间是常量。由于 n 是常量,coder.findOrError 的输出是长度为 n 的固定大小向量。此示例对 n 使用值 3

定义入口函数 locateFirstThreeNonzeroElements,它返回一个 3×4 矩阵中前三个非零元素的线性索引。

function k = locateFirstThreeNonzeroElements(X)
arguments
    X (3,4) double
end

k = coder.findOrError(X,3);
end

由于预期的非零元素数是常量,因此在生成代码中输出 k 具有固定大小 3。此外,输入数组 X 也具有固定大小。因此,在为此函数生成代码时,您可以禁用对可变大小数组的支持。

locateFirstThreeNonzeroElements 生成仅使用固定大小数组的 MEX 函数。

cfg = coder.config("mex");
cfg.EnableVariableSizing = false;
codegen -config cfg locateFirstThreeNonzeroElements
Code generation successful.

使用 3×4 输入数组运行生成的 MEX 函数。该函数返回输入数组的前三个非零元素的线性索引。

locateFirstThreeNonzeroElements_mex([0 1 1 0; 0 0 0 0; 1 0 1 0])
ans =

  3×1 int32 column vector

   3
   4
   7

使用另一个只有两个非零元素的 3×4 输入数组运行生成的 MEX 函数。该函数产生运行时错误。

locateFirstThreeNonzeroElements_mex([0 1 0 0; 0 0 0 0; 1 0 0 0])
Function coder.findOrError expects 3 non-zero elements, but receives 2.

在此示例中,您查找无界可变大小行向量中最后 n 个非零元素的值,其中 n 的值在运行时提供。由于 n 在代码生成期间不是常量,因此 coder.findOrError 的输出是可变大小向量。

定义入口函数 findLastNNonzeroElements,它返回无界可变大小行向量 X 中最后 n 个非零元素的值。

function v = findLastNNonzeroElements(X,n)
arguments
    X (1,:) double
    n (1,1) double
end

[~,~,v] = coder.findOrError(X,n,"last");
end

使用默认配置设置为 findLastNNonzeroElements 生成 MEX 函数。由于输入数组 X 具有无界可变大小,生成代码必须启用对可变大小数据和动态内存分配的支持。

codegen findLastNNonzeroElements
Code generation successful.

使用示例输入运行生成的 MEX 函数。该函数返回输入向量的前四个非零元素的线性索引。

findLastNNonzeroElements_mex([1 3 0 0 0 3 4 2 0],4)
ans =

     3     3     4     2

输入参数

全部折叠

输入数组,指定为标量、向量、矩阵或多维数组。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char
复数支持:

要查找的非零元素数量,指定为正整数标量。

搜索方向,指定为字符串 "first""last"。使用 nX 中查找 find(X,n,"last") 个非零元素。

输出参量

全部折叠

非零元素的索引,以 int32 值的向量形式返回。

您可以使用 X(k) 返回 X 中的非零值。

行下标,以 int32 值的向量形式返回。rowcol 一起指定与 X 中的非零元素对应的 X(row,col) 下标。

列下标,以 int32 值的向量形式返回。rowcol 一起指定与 X 中的非零元素对应的 X(row,col) 下标。

如果 X 是多维数组且 N > 2,则 colXN-1 尾部维度的线性索引。这会保留关系 X(row(i),col(i)) == v(i)

X 的非零元素,以向量形式返回。

扩展功能

全部展开

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2026a 中推出

另请参阅