是否可以通过在matlab中调用c/c++代码来加速matlab绘图?

2023-12-27

一般来说很容易调用mexMatlab 中的文件(用 c/c++ 编写)以加速某些计算。然而,根据我的经验,Matlab 的真正瓶颈是数据绘图。创建句柄非常昂贵,即使您只更新句柄数据(例如 XData、YData、ZData),这也可能需要很长时间。更糟糕的是,由于 Matlab 是单线程程序,因此不可能同时更新多个绘图。

因此我的问题: 是否可以编写一个 Matlab GUI 并调用 C++(或其他一些可并行代码)来处理绘图/可视化?我正在寻找一个可以在 Windows、Mac 和 Linux 上运行的跨平台解决方案,但是任何能让我在任一操作系统上开始使用的解决方案都非常感谢!

我找到了一个C++ 库 http://code.google.com/p/matplotpp/好像是用Matlab的plot()语法,但我不确定这是否会加快速度,因为我担心如果我绘制到 Matlab 中figure()窗口,事情可能会再次放缓。

我非常感谢以前处理过这种情况的人的任何评论和反馈!

EDIT:显然,我已经分析了我的代码,瓶颈是绘图(数十个带有大量数据的面板)。

EDIT2:为了让你获得赏金,我需要一个现实生活中的、最小的工作示例来说明如何做到这一点 - 暗示性答案对我没有帮助。

EDIT3:关于要绘制的数据:在最简单的情况下,考虑 20 个线图,每秒需要更新 1000000 个数据点。

EDIT4:我知道要绘制的点数量很大,但我从未说过这个问题很简单。我不能仅仅忽略某些数据点,因为在实际绘制数据之前无法评估哪些点是重要的(数据以亚毫秒时间分辨率采样)。事实上,我的数据是使用商业数据采集系统获取的,该系统带有数据查看器(用c++编写)。该程序可以毫无问题地可视化多达 60 个线图,甚至包含超过 1000000 个数据点。

EDIT5:我不喜欢当前讨论的方向。我知道对数据进行二次采样可能会加快速度 - 然而,这不是问题。这里的问题是如何让 c / c++ / python / java 接口与 matlab 一起使用,以便通过直接与硬件对话(或使用任何其他技巧/方式)来加速绘图


您是否尝试过将渲染方法更改为的简单解决方案OpenGL ?

opengl hardware;
set(gcf,'Renderer','OpenGL');

警告! 在这种模式下会有一些东西消失,看起来会有点不同,但通常剧情会运行much更快,特别是如果您有硬件加速器。

顺便问一下,您确定您真的会获得性能提升吗? 例如,根据我的经验,WPF图形在C#比 Matlab 慢得多,尤其是散点图和圆圈。

Edit:我想到了这样一个事实:实际绘制到屏幕上的点数不可能那么多。基本上,这意味着您需要在屏幕上有像素的地方进行插值。查看这个对象:

classdef InterpolatedPlot < handle
    properties(Access=private)
        hPlot;
    end

    methods(Access=public)
        function this = InterpolatedPlot(x,y,varargin)
            this.hPlot = plot(0,0,varargin{:});
            this.setXY(x,y);
        end        
    end    

    methods
        function setXY(this,x,y)
            parent = get(this.hPlot,'Parent');
            set(parent,'Units','Pixels')
            sz = get(parent,'Position');
            width = sz(3); %Actual width in pixels
            subSampleX = linspace(min(x(:)),max(x(:)),width);

            subSampleY = interp1(x,y,subSampleX);
            set(this.hPlot,'XData',subSampleX,'YData',subSampleY);
        end

    end
end

这是如何使用它的示例:

function TestALotOfPoints()
    x = rand(10000,1);
    y = rand(10000,1);

    ip = InterpolatedPlot(x,y,'color','r','LineWidth',2);

end

另一个可能的改进:另外,如果您的 x 数据已排序,您可以使用interp1q代替interp,这会快得多。

classdef InterpolatedPlot < handle
    properties(Access=private)
        hPlot;
    end

%     properties(Access=public)
%         XData;
%         YData;      
%     end

    methods(Access=public)
        function this = InterpolatedPlot(x,y,varargin)
            this.hPlot = plot(0,0,varargin{:});
            this.setXY(x,y);
%             this.XData = x;
%             this.YData = y;
        end        
    end    

    methods
        function setXY(this,x,y)
            parent = get(this.hPlot,'Parent');
            set(parent,'Units','Pixels')
            sz = get(parent,'Position');
            width = sz(3); %Actual width in pixels
            subSampleX = linspace(min(x(:)),max(x(:)),width);

            subSampleY = interp1q(x,y,transpose(subSampleX));
            set(this.hPlot,'XData',subSampleX,'YData',subSampleY);
        end

    end
end

以及用例:

function TestALotOfPoints()
    x = rand(10000,1);
    y = rand(10000,1);
    x = sort(x);
    ip = InterpolatedPlot(x,y,'color','r','LineWidth',2);

end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以通过在matlab中调用c/c++代码来加速matlab绘图? 的相关文章

随机推荐

  • phonegap 运行 android - 创建命令失败,退出代码为 8 - linux

    我做了一些谷歌搜索 但没有发现任何有价值的东西 任何帮助表示赞赏 使用裸虚拟机尝试一下以确保 没有 Nodejs 安装或依赖问题 基督教 sudo apt get install nodejs sudo apt get install no
  • MembershipProvider 更改代码中的连接字符串

    我正在尝试在我的网站中实现 Asp net 表单身份验证 通常 您在 web config 中提供数据库连接字符串的名称 然而 由于我们的数据库设置有点复杂 我一直在寻找一种在代码中手动向 MembershipProvider 提供连接字符
  • 如何在 RubyMine 上使用 bundle exec rake?

    我在堆栈溢出中找到了这篇文章rubymine 错误 您已经激活了 rake 10 0 3 但您的 Gemfile 需要 rake 0 9 6 使用bundle exec 可以解决这个问题 https stackoverflow com qu
  • 字符串格式的疯狂问题

    我遇到了一个让我发疯的问题 我的宏中有两个 FOR 循环 每个循环都有一个计数器来跟踪某个过程执行的次数 计数器工作得很好 并且在循环结束时包含正确的数字 我要做的下一件事是将计数格式化为带有前导零的五位数字 我尝试过使用两种不同的方法 见
  • Celery:长期专用的整体任务与短期的多个任务

    在我的解决方案中 我使用分布式任务来监视硬件实例一段时间 例如 10 分钟 当以下情况时我必须做一些事情 我开始这个监控会话 我完成了这个监控会话 可能 在监控会话期间 在整个会话 10 分钟 内运行单个任务并执行所有这些操作是否安全 或者
  • 在过去的 7-8 年里,对 C++ 编程影响最大的是什么?

    我开始用 C 编程 这是我的第一语言 但我已经很多年没有使用它了 C 世界有哪些新的发展 什么是重要的东西 技术 书籍 框架 库等 在过去的 7 8 年里 对 C 编程影响最大的是什么 也许我们可以对每个帖子产生一个影响 这样我们就可以对它
  • IOError: [Errno 22] 无效参数 python write

    我正在写入网络共享 这是写入的代码 while not created fileName join random choice CANDIDATE CHARS for x in range len fullPath os path join
  • 如何修复 FileZilla 的响应:“550 提供的消息不完整。签名未验证。”?

    如何修复 FileZilla 的响应 550 提供的消息不完整 签名未得到验证 这有什么问题吗 这是在我的托管站点中还是在我的 FileZilla 设置中 由于已知错误 Windows IIS 服务器返回此错误 详细信息请参见微软文章修复
  • Visual Studio Code 中的多个格式化程序

    在我的团队中 有些人使用 VS Code 其他人使用 WebStorm 为了调整代码格式 我编写了 VS Code 的扩展 添加了一些缺失的规则 我的计划是与 VS Code 附带的本机格式化程序一起运行我的扩展 我使用 API 提供我的编
  • .NET 高级中 .NET 4.0 和 .NET 4.5 之间的差异

    渴望了解 NET 4 0 和 NET 4 5 在 NET 高级方面的差异以及 ASP NET C 以及这些框架中的差异 NET Framework 4 5 中的新增功能 http www techbubbles com net framew
  • 按多个属性对对象进行排序

    我一直在研究一些需要我按三个属性对对象 软饮料 进行排序的事情 name str colour str and volume int 我进行了研究并找到了分别按名称 颜色和体积对它们进行排序的方法 但是有没有一种方法可以按所有三个对它们进行
  • 如何使用 django 检查 postgresql 数据库中是否存在某些内容?

    我想检查数据库中的行是否已包含特定输入 如果它已经存在 则防止再次添加它 如果不存在 则像平常一样添加它 如何询问数据库是否存在某些内容 而不需要从数据库中提取所有内容进行检查 您可以使用 Entry objects filter name
  • 权限拒绝:打开提供程序 com.android.providers.media.MediaDocumentsProvider

    我试图允许用户访问他的照片库以获取个人资料图片 并将该个人资料图片保存到 SharedPreferences 中 我还有一个导航栏 可以从 SharedPreferences 获取这张图片 我收到以下错误 java lang Securit
  • Android Studio:多个模块的多个 APK

    在 Android 中 有一种方法可以为项目中的所有模块生成签名的 APK 例如 我有以下项目 Project Library Module Module 1 Module 2 Module 3 我想用一个命令为所有 3 个模块生成 APK
  • 如何将字符串解析为 std::map 并验证其格式?

    我想解析一个字符串 0 1 2 3 into a std map 我可以编写一个小函数来解析字符串
  • 如何限制React Native Packager(android)(gradle)中的工作人员数量?

    在 Circleci 上使用 React gradle 构建 Android React Native 项目会耗尽最大 4GB 内存 导致内存压力的问题之一是打包程序启动的 30 多个节点工作进程 每个进程占用近 80MB 请参阅下面的示例
  • 编程错误:关系“django_session”不存在

    将数据库从 sqlite 更改为 postgresql 后出现此错误 我已经更改了所有设置 这是我的设置 DATABASES default ENGINE django db backends postgresql psycopg2 NAM
  • cscope 是否具有搜索历史或搜索查询堆栈功能?

    我通常使用 cscope 从一个方法到另一个方法挖掘超过 4 5 个级别的 c 源代码 并且我必须在这些方法之间来回切换 如何在 cscope 中查看搜索历史记录 这样我就不必记住以前的方法名称 或者如果它是一个堆栈会更好 是的 它确实 帮
  • 将 Stripe 与 Angular 5 结合使用

    我有一个有角度的应用程序 它使用 Stripe 来保存客户支付卡信息 我将此脚本包含在我的index html中 该脚本提供了一个 Stripe 对象 我可以这样使用 问题是 如何从我的 Angular TypeScript 代码访问 St
  • 是否可以通过在matlab中调用c/c++代码来加速matlab绘图?

    一般来说很容易调用mexMatlab 中的文件 用 c c 编写 以加速某些计算 然而 根据我的经验 Matlab 的真正瓶颈是数据绘图 创建句柄非常昂贵 即使您只更新句柄数据 例如 XData YData ZData 这也可能需要很长时间