【win10+matlab】.c文件封装函数,.m程序显示未定义函数问题

本文记录了在使用Matlab进行图像处理代码调试时遇到的mex文件未定义错误及解决过程。作者通过检查文件路径、安装编译器及重新编译.c文件解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下内容纯属我个人在这初用matlab期间遇到的一些问题,和我所用的解决方式。

事情是这样的:

一开始安装好了matlab,用于跑图像处理的一篇论文的代码。

根据本地项目的路径,配置好了相应的文件路径。如下图。


然后我就开始运行该项目。

发现报错了,问题提示是一连串的报错。

我先检查了从配置路径获取到的文件的值是否正确,如下图。


发现没有问题以后,才发现是某个函数执行有问题,从这个函数继续往深处挖,通过多次的函数调用,最终找到了是某个函数显示未定义问题。我在这整个项目里翻了一遍,最终发现这个函数是一个mex文件(即.c文件编译后,用于matlab的文件格式)。可是在这个文件夹当中,明明已经有了mex文件(如下图红框所示),也就是说我所运行的这个.m文件应该是能够直接调用的才对。


通过一番百度,我一开始以为是我的matlab没有安装gcc这样能够编译.c文件的编译器。(通过在命令行输入mex -setup,提示未安装相应的编译器),于是我根据提示去安装了一个【MinGW-64 C/C++】,编译器安装完了以后,发现!还是报函数未定义的错。。。于是乎继续百度。。知道我偶然(把报错的部分一部分一部分地拿去百度。。。)看到了这么一个解决方案,这个人遇到的问题是Link error问题,如下图。


然后有人提出说用这三种方法去解决。我就一个一个试了一下,直到!我试到第三个方法,把之前那些.c文件重新用编译器编译了一遍,竟然!生成了一个跟原有的mex文件奇像无比的mex文件。。。就差了一个字符,如下图。然后我就把所有的.c文件全部重新编译了一遍,发现代码终于能跑通了!


写到这里,总结一下:

如果是跑别人的代码,发现有别人自己写的函数,在你这里发生了函数未定义这种问题,

第一检查函数文件路径,确保你的编译器在运行过程中,自动搜索函数的时候能够覆盖到相应的函数位置。

第二确保函数编译生成的可执行文件,是适用于你的编程环境的。(最好自己再把函数文件全部编译一遍,保险)

把以下程序转化为Julia程序语言:function varargout = chepaishibie(varargin) % CHEPAISHIBIE MATLAB code for chepaishibie.fig % CHEPAISHIBIE, by itself, creates a new CHEPAISHIBIE or raises the existing % singleton*. % % H = CHEPAISHIBIE returns the handle to a new CHEPAISHIBIE or the handle to % the existing singleton*. % % CHEPAISHIBIE('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in CHEPAISHIBIE.M with the given input arguments. % % CHEPAISHIBIE('Property','Value',...) creates a new CHEPAISHIBIE or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before chepaishibie_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to chepaishibie_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help chepaishibie % Last Modified by GUIDE v2.5 30-Aug-2022 15:08:37 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @chepaishibie_OpeningFcn, ... 'gui_OutputFcn', @chepaishibie_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before chepaishibie is made visible. function chepaishibie_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject
03-20
根据这段HLS代码写一段仿真测试文件:#include “SmoothProfileOnXAxisMean.h” void SmoothProfileOnXAxisMean(hls::stream& points_in_z, hls::stream& smoothed_z, ap_uint<6> mean_win_size, float invalid_z ) { // #pragma HLS DATAFLOW #pragma HLS INTERFACE axis port=points_in_z #pragma HLS INTERFACE axis port=smoothed_z #pragma HLS INTERFACE ap_none port=mean_win_size #pragma HLS INTERFACE ap_none port=invalid_z #pragma HLS INTERFACE ap_ctrl_none port=return float result = 0.0f; float mean_registers [33]; #pragma HLS ARRAY_PARTITION dim=1 type=complete variable=mean_registers // 上一周期window size static ap_uint<6> last_mean_win_size = 0; // 新周期刷新window size if (mean_win_size != last_mean_win_size) { last_mean_win_size = mean_win_size; } // 使用稳定window size ap_uint<6> stable_mean_win_size = 0; stable_mean_win_size = last_mean_win_size; int half_window = stable_mean_win_size / 2; // 初始化寄存器 for (int i = 0; i < 33; i++) { #pragma HLS UNROLL mean_registers[i] = 0.0f; } // 主循环 for (int i = 0; i < 3200 + half_window; i++) { #pragma HLS PIPELINE II=1 bool data_available = (i < 3200); // 数据读使能 float new_value = 0.0f; ap_uint<8> gray_new_value = 0; // 接收数据流 if (data_available) { new_value = points_in_z.read(); } // 数据移位寄存 for (int j = 32; j > 0; j–) { mean_registers[j] = mean_registers[j - 1]; } mean_registers[0] = data_available ? new_value : mean_registers[0]; // 如果窗口中心点是无效值,则直接输出无效值 if (mean_registers[half_window] == invalid_z) { smoothed_z.write(invalid_z); continue; } // 边界处直接输出源值 if (((i >= half_window) && (i < stable_mean_win_size - 1)) || (i >= 3200)) { smoothed_z.write(mean_registers[half_window]); continue; } // 窗口填满后开始滤波处理 else if ((i >= stable_mean_win_size - 1) && (i <= 3200)) { float sum = 0.0f; int valid_count = 0; if (stable_mean_win_size == 1) { for (int k = 0; k < 1; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } if (stable_mean_win_size == 3) { for (int k = 0; k < 3; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } if (stable_mean_win_size == 5) { for (int k = 0; k < 5; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } else if (stable_mean_win_size == 9) { for (int k = 0; k < 9; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } else if (stable_mean_win_size == 17) { for (int k = 0; k < 17; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } else if (stable_mean_win_size == 33) { for (int k = 0; k < 33; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } // 计算并输出均值 result = (valid_count > 0) ? sum / valid_count : invalid_z; smoothed_z.write(result); } } }
最新发布
07-23
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值