跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 实现 MATLAB ismember 函数原理与代码解析

MATLAB ismember 函数用于判断集合元素是否存在于另一集合中。通过 C++ 语言复现该逻辑,展示如何构建行向量指针返回存在性标记及位置索引。核心算法采用双重循环遍历比对,时间复杂度为 O(N*M)。代码包含环境依赖配置、核心实现类及测试用例,适用于需要跨语言移植 MATLAB 算法的场景。

猫巷少女发布于 2017/9/4更新于 2026/6/1328 浏览
C++ 实现 MATLAB ismember 函数原理与代码解析

C++ 实现 MATLAB ismember 函数原理与代码解析

环境配置

要在 C++ 环境中复现 MATLAB 的 ismember 功能,首先需要准备好基础库文件。确保项目能够链接到 Matlab2c 相关的动态库和头文件。

  1. 获取依赖:确认已下载 Matlab2c.dll、Matlab2c.h 及 Matlab2c.lib。
  2. 路径设置:将 .dll 文件放置于可执行文件同级目录,.h 和 .lib 加入项目的包含路径与链接库路径。
  3. 引入头文件:在源文件中添加必要的引用。
#include "Matlab2c.h"
#pragma comment(lib, "Matlab2c.lib")
using namespace Matlab2c;

函数逻辑分析

ismember 的核心作用是检测一个集合中的元素是否存在于另一个集合中。在 MATLAB 中,它返回两个向量:一个是布尔标记(存在为 1,不存在为 0),另一个是位置索引(存在则返回下标,不存在则为 0)。

在我们的 C++ 实现中,为了更贴近底层逻辑,我们将返回值设计为:第一个向量记录存在性(1/0),第二个向量记录位置索引(存在为下标,不存在为 -1)。输入参数为两个行向量(一维矩阵),输出为指向结果向量的指针数组。

C++ 核心实现

这里采用双重循环遍历比对的方式。外层遍历集合 A 的元素,内层在集合 B 中查找匹配项。虽然对于大数据集这种 O(N*M) 的复杂度不是最优解,但作为算法原型非常直观。

Matrix* Matlab2c::ismember(Matrix& a, Matrix& b) {
    bool exist = false;
    Matrix *p;
    // p1 记录 a 中的元素是否存在于 b 中,存在为 1,不存在为 0
    Matrix p1(1, a.column);
    // p2 记录 a 中的元素在 b 中的位置,不存在则为 -1
    Matrix p2(1, a.column);
    
    p = new Matrix[2];
    
    for (int j = 0; j < a.column; j++) {
        int n = 0;
        exist = false;
        // 在集合 b 中线性查找当前元素
        for (n = 0; n < b.column; n++) {
            if (a.data[j] == b.data[n]) {
                exist = true;
                break;
            }
        }
        
        if (exist) {
            p1.data[j] = 1;
            p2.data[j] = n;
        } else {
            p1.data[j] = 0;
            p2.data[j] = -1;
        }
    }
    
    *p = p1;
    *(p + 1) = p2;
    return p;
}

注意:实际工程中如果数据量较大,建议先对集合 B 排序或使用哈希表优化查找效率,此处保留原始逻辑以方便理解算法流程。

测试验证

编写一个简单的 main 函数来验证逻辑是否正确。我们定义两个示例数组,调用封装好的 ismember 方法并打印结果。

#include "Matlab2c.h"
#pragma comment(lib, "Matlab2c.lib")
using namespace Matlab2c;

int main() {
    double a[] = {1, 1, 2, 4, 4, 3};
    double b[] = {1, 2, 5};
    
    Matrix aa(1, 6, a);
    Matrix bb(1, 3, b);
    
    Matrix* cc = Matlab2c::ismember(aa, bb);
    
    // 输出存在性标记
    cout << (*(cc + 0)).toString() << endl;
    // 输出位置索引
    cout << (*(cc + 1)).toString() << endl;
    
    system("pause");
    return 0;
}

运行上述代码后,控制台应显示第一行为 [1, 1, 1, 0, 0, 0](表示前三个元素在 B 中存在),第二行为对应的位置索引或 -1。通过这种方式,我们可以快速验证移植后的算法是否符合预期。

目录

  1. C++ 实现 MATLAB ismember 函数原理与代码解析
  2. 环境配置
  3. 函数逻辑分析
  4. C++ 核心实现
  5. 测试验证
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • HTML 基础语法与常用标签详解
  • 九联 UNT413A 刷机全流程解析与避坑
  • 程序员适合考取的职业资格证书指南
  • Ubuntu 系统安全彻底删除后端服务指南
  • 企业级工作流引擎低代码开发实战:RuoYi-Flowable-Plus 指南
  • 基于 YOLOv8 的无人机道路损伤识别系统工程实践
  • Open WebUI Docker 部署指南与最佳实践
  • GraphRAG 与传统 RAG:核心差异、选型策略与融合方案
  • CyberStrike AI 与 HexStrike AI 联动部署指南
  • Ubuntu 下 Python 连接 KingbaseES 数据库实现增删改查
  • 基于机器学习的生态组合塘强化城市污水处理厂脱氮优化
  • 前端大数据导出优化:解决 Chrome 内存崩溃的实战方案
  • 基于 SpringBoot 的乡镇居民诊疗信息系统设计与实现
  • Clawdbot 镜像免配部署 Qwen3-32B:Web 网关直连方案
  • 新版 IntelliJ IDEA 恢复右上角 Git 更新和提交按钮设置
  • Qwen3-VL SDK 发布:支持 Python/Java/C# 多语言调用
  • ClawdBot (OpenClaw) Discord 机器人部署指南
  • FPGA 温度采集系统设计:MAX6675 驱动与 Qt 上位机曲线绘制
  • OpenClaw 本地 AI 智能体 Windows10 一键部署指南
  • Qwen-Multiple-Angles:角色与产品多视角生成插件,96 种相机角度控制

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online