标签: matlab-coder

无法使用Matlab Coder将Matlab代码转换为C代码

我有一个MATLAB代码如下所示.我试图使用MATLAB Coder将此代码转换为C代码,但我遇到了错误.

在此输入图像描述

预期逻辑,char,int,fi,single或double.找到了一个mxArray.MxArrays从对MATLAB解释器的调用返回,并且在表达式中不受支持.它们可能只用于赋值的右侧,也可用作外在函数的参数.

% Applies A-weighted filtering to sound and draws it's plot
% in a figure as output.
function A_filtering
coder.extrinsic('tic')
coder.extrinsic('toc')
coder.extrinsic('display')
sampleRate = 44100;
reader = dsp.AudioFileReader('Jet_Flypast.wav');
fs = 44100;
weightFilter = weightingFilter('A-weighting',fs);
% fileWriter = dsp.AudioFileWriter('SampleRate',fs);
% visualize(weightFilter,'class 1')
scope = dsp.SpectrumAnalyzer('SampleRate',fs,...
    'PlotAsTwoSidedSpectrum',false,...
    'FrequencyScale','Log',...
    'FrequencyResolutionMethod','WindowLength',...
    'WindowLength',sampleRate,...
    'Title','A-weighted filtering',...
    'ShowLegend',true,...
    'ChannelNames',{'Original Signal','Filtered Signal'});

tic
while toc < 60
    x = reader();
    y = weightFilter(x);
    scope([x(:,1),y(:,1)])
    display(x(:,1))
end

release(scope);
release(weightFilter);
release(reader);
end
Run Code Online (Sandbox Code Playgroud)

这个问题可能是重复的,但我搜索了互联网,找不到任何相关的帖子.有什么方法可以解决这个错误吗?

c matlab code-generation mex matlab-coder

4
推荐指数
1
解决办法
144
查看次数

如何将 float[][] 类型数组转换为“emxArray_real_T *x”

我已经转换了一个函数,该函数将 NxN 矩阵作为输入,并使用 MatlabCoder 从 matlab 到 C 提供 NxN 矩阵输出。它给了我具有两个参数的函数,即

void func(const emxArray_real_T *x, emxArray_real_T *y)
Run Code Online (Sandbox Code Playgroud)

我知道 x 是函数的输入,我可以从 y 获得函数的输出。问题是我在 float[][] 中有一个数组,我希望将此数据作为输入提供给 func,它只将 emxArray_real_T *x 作为输入。

关于如何将此 float[][] 数据转换为 emxArray_real_T *x 的任何想法

emxArray_real_T 有这个结构

struct emxArray_real_T
{
    real_T *data;
    int32_T *size;
    int32_T allocatedSize;
    int32_T numDimensions;
    boolean_T canFreeData;
};
Run Code Online (Sandbox Code Playgroud)

c matlab matlab-coder

3
推荐指数
1
解决办法
4528
查看次数

在matlab中具有多个匹配的switch-case用于代码生成

以下代码是有效的matlab sytax,用于检查是否b匹配中的任何元素a.但是,如果代码用于代码生成(即simulink),那么我得到错误:

'code generation only supports cell operations for varargin and varargout  
Run Code Online (Sandbox Code Playgroud)

您可以通过%#codegen在脚本顶部添加来检查这一点.)

a={2 3};
b=3;
switch b
    case a
        disp yay
    otherwise
        disp boo
end
Run Code Online (Sandbox Code Playgroud)

case在代码生成兼容代码中,我应该如何匹配语句中的多个模式?

以下内容对我不起作用:

case a(1) || a(2) %//with a=[2, 3] above, since cells not allowed

case a(:)
Run Code Online (Sandbox Code Playgroud)

matlab code-generation simulink switch-statement matlab-coder

3
推荐指数
1
解决办法
4308
查看次数

在MATLAB中代码生成期间替代外部函数,如imread和其他函数

如您所知,在代码生成过程中不输出外部函数.这些功能和/或解决方案是否有替代方案可以解决这个问题?我的代码生成错误报告如下所示:

代码生成错误报告

我很惊讶,我不能输出sizergb2gray两种.由于这些对我的计划至关重要,我无法避免.

将非常感谢帮助!

matlab code-generation image-processing matlab-coder matlab-cvst

2
推荐指数
1
解决办法
898
查看次数

在Matlab中非递归地实现perms,与Coder兼容

我试图使用编码器将我在matlab中的部分功能转换为c ++.编码器不支持该功能perms.我perms在我的代码中广泛使用.在线查看后,我发现很少有关于如何生成所有排列列表的建议,perms但是它是"手动"完成的,这意味着对于3个元素的排列,我们有3个for循环,4个元素我们有4个循环,等等.

示例1:4:

row = 1; 
n=a;
Z = zeros(factorial(n),n);
idxarray1=[1:4];

for idx=idxarray1
    idxarray2=idxarray1(find(idxarray1~=idx)) ;  
    for jdx=idxarray2
        idxarray3=idxarray2(find(idxarray2~=jdx)); 
        for kdx=idxarray3
            idxarray4=idxarray3(find(idxarray3~=kdx)) ;
            for mdx=idxarray4
                Z(row,:) = [idx,jdx,kdx,mdx];
                row = row + 1 ;
            end
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

对于8个元素,我必须编写8个for循环,有关如何为n个元素转换它的任何建议吗?就像是

for i=n:-1:1
    I=[1:n] ;
    for j=1:i
       J=I(find(I~=j));

... ?


thank you
Run Code Online (Sandbox Code Playgroud)

c++ matlab permutation matlab-coder perms

2
推荐指数
1
解决办法
181
查看次数

使用MATLAB功能块在Simulink中生成随机数

我试图谷歌这个问题并在这里搜索问题和答案,但我发现我的问题没有明确的答案,所以我正在制作一个新问题.希望不会太麻烦!

我正在Simulink中创建一个模拟,我有一个"MATLAB函数"-block,它应该从另一个源获取输入(我们可以认为这个源是一个"常量"-block),然后应用一个由输入上的MATLAB功能块.

我的问题是,每次运行Simulink仿真时,我都得到完全相同的随机数.我想知道是否有人可以帮助我解决我的问题?

这是代码(不是所有代码,但重要的是所有代码):

% function MC_output = randomizer(Stat_input)
%#codegen    minrand = 0.1;
    maxrand = 1.9;
    points = 10;    
    rand_numbers = Stat_input*minrand + rand(1, points).*(maxrand-minrand);
    MC_output = mean(rand_numbers);
end
Run Code Online (Sandbox Code Playgroud)

我已经读过这个解决方案:

coder.extrinsic('rng');
rng('shuffle');
Run Code Online (Sandbox Code Playgroud)

我以不同的方式使用它但没有成功.一些帮助会非常受欢迎!哦,顺便说一下,我正在使用MATLAB R2012a.

提前谢谢,尼克拉斯

random matlab simulink matlab-coder

1
推荐指数
1
解决办法
3219
查看次数

MATLAB 编码器支持的 csvread 函数

我有一个 MATLAB 脚本,其中包含csvread从 csv 文件中读取数据的调用。现在我正在尝试使用 MATLAB Coder 将我的 MATLAB 脚本编译成 C。但是,csvread不支持的功能的构件对C代码生成。

我发现的唯一读取文件功能是fread只读取二进制文件。有没有办法用来fread读取 csv 文件或者有什么方法可以解决这个问题?

示例 MATLAB 脚本:

data = csvread('data.csv');
Run Code Online (Sandbox Code Playgroud)

示例 csv 文件:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

csv matlab matlab-coder

1
推荐指数
1
解决办法
794
查看次数

没有'new'关键字的C++中的内存分配

我有一些由MATLAB Coder生成的代码.它包括这种类型的一些变量定义:

int tmp_size[400];
Run Code Online (Sandbox Code Playgroud)

在方法范围结束之前,不会显式删除这些变量.

变量是在堆还是堆栈上分配的?这相当于以下几点吗?

int* tmp_size = new int[400];
Run Code Online (Sandbox Code Playgroud)

是否最好用内存管理来重写这些变量定义new,比如int* tmp_size = new int[400];

我注意到内存是由我的程序分配的,永远不会被释放.这可能是造成内存泄漏的原因吗?

c++ memory-leaks memory-management new-operator matlab-coder

-2
推荐指数
1
解决办法
1069
查看次数