这两者有什么区别?
据我所知,MATLAB编译器将MATLAB代码包装成.exe文件,这样它就可以在不安装MATLAB的情况下使用,只需要MCR.除此之外,MATLAB Builder NE还可用于生成.Net程序集,与.Net框架而不是.exe文件一起使用,但它们仍然需要MCR.
现在我不明白MATLAB Coder用的是什么?它生成C/C++代码.但MATLAB代码是否真的转换为C/C++,还是仅仅像MATLAB编译器那样打包?是否还需要MCR才能运行?
我知道这不是一个编程问题.但我搜索了互联网,但仍然没有找到明确的答案.这些是非常昂贵的产品,所以我想知道我正在进入什么.
当使用MATLAB Coder生成C代码时,当if在另一个if或其else部分的主体中发生时,行为是不同的.以下情况很容易创建输出大小为5x5的C代码:
function y = foo1(u)
if u > 0
y = zeros(2,2);
else
y = zeros(5,5);
end
Run Code Online (Sandbox Code Playgroud)
现在这个也适用
function y = foo2(u,v)
if u > 0
y = zeros(2,2);
else
y = zeros(5,5);
if v > 0
y = 2 * y;
end
end
Run Code Online (Sandbox Code Playgroud)
但是这个无法生成代码,抱怨大小不匹配:
function y = foo3(u,v)
if u > 0
y = zeros(2,2);
if v > 0
y = 2 * y;
end
else
y = zeros(5,5);
end
Run Code Online (Sandbox Code Playgroud)
这是命令行中的输出:
>> …Run Code Online (Sandbox Code Playgroud) 我试图调用Matlab编码器生成的一些c代码.Matlab使用名为emxArray的ac结构来表示矩阵(在此处记录:http://www.mathworks.co.uk/help/fixedpoint/ug/c-code-interface-for-unbounded-arrays-and-structure-fields.html).
struct emxArray_real_T
{
double *data;
int *size;
int allocatedSize;
int numDimensions;
boolean_T canFreeData;
};
Run Code Online (Sandbox Code Playgroud)
我几乎没有经验ctypes,我正在努力创建一个等效的结构,然后我可以使用它来传递向量来回传递给c .so中定义的函数.
这是我到目前为止在python中的地方......
class EmxArray(ctypes.Structure):
""" creates a struct to match emxArray_real_T """
_fields_ = [('data', ctypes.POINTER(ctypes.c_double)),
('size', ctypes.POINTER(ctypes.c_int)),
('allocatedSize', ctypes.c_int),
('numDimensions', ctypes.c_int),
('canFreeData', ctypes.c_bool)]
Run Code Online (Sandbox Code Playgroud)
但是,如果我定义这个:
data = (1.1, 1.2, 1.3, 1.4)
L = len(data)
x = EmxArray()
x.data = (ctypes.c_double * L)(*data)
x.data = (ctypes.c_int * 1)(L)
Run Code Online (Sandbox Code Playgroud)
这可行
print len(x.data[:L])
for v in x.data[:L]: print v
Run Code Online (Sandbox Code Playgroud)
编辑:我已整理并采纳了Roland的建议,并可以使用提取数据
data_out = x.data[:L] …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用MATLAB Coder将代码从Matlab转换为MEX文件.如果我有以下格式的代码段:
x = zeros(a,1)
x(a+1) = 1
Run Code Online (Sandbox Code Playgroud)
然后在Matlab中,这将调整数组大小以适应新元素,而在MEX文件中,这将给出"索引超出矩阵尺寸"错误.我希望代码中有很多地方可以发生这种情况.
我想要做的是运行代码的MATLAB版本(不使用编码器)但是MATLAB在调整数组大小时会生成错误或警告,因为我分配了一些超出边界的东西.(我可以使用MEX文件查看错误弹出的位置,但这需要每次更改代码时使用MATLAB Coder重建整个MEX文件,这需要一段时间.)
有没有办法做到这一点?在MATLAB中是否有任何类型的设置将关闭"如果分配到越界索引时自动调整大小",或者如果发生这种情况则发出警告?
我有这样的枚举:
classdef(Enumeration) bla_type < int32
enumeration
bla_one(1)
bla_2(2)
end
end
Run Code Online (Sandbox Code Playgroud)
我可以像这样得到'元素的字符串表示':
char(bla_type.bla_one)
Run Code Online (Sandbox Code Playgroud)
=>
bla_one
Run Code Online (Sandbox Code Playgroud)
不幸的是,matlab编码器不喜欢这个.还有其他选择吗?
在MATLAB中迭代结构数据类型的常用方法是使用以下fieldnames()函数:
mystruct = struct('a',3,'b',5,'c',9);
fields = fieldnames(mystruct);
for i=1:numel(fields)
mystruct.(fields{i});
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,这总是生成单元格数据类型,我想在SIMULINK中使用这种迭代来进行Matlab功能块,因为代码生成原因不允许单元格数据类型.
有没有办法在不同时使用单元数据类型的情况下迭代结构?
在Octave中有一种简洁的方法,在https://www.gnu.org/software/octave/doc/interpreter/Looping-Over-Structure-Elements.html中有解释.
for [val, key] = mystruct
# do something esp. with 'key'
end
Run Code Online (Sandbox Code Playgroud)
有没有人在MATLAB中知道类似的方法?
将图像分割成N个超像素后,我需要指定与一个超像素相邻或不相邻的超像素,并为所有超像素确定这种关系。
[L,NumLabels] = superpixels(A,200);
Run Code Online (Sandbox Code Playgroud)
如何为每个超像素指定相邻的超像素?
更新资料
我已经尝试了@Cris Luengo介绍的解决方案。但是出现了以下错误:
B=imread('H.jpg');
[L,N] = superpixels(B,200);
glcms=graycomatrix(L);
k=glcms(:,50); %SupNum=50
[r,~]=find(k>0);
aa=find(r==50);
r(aa)=[];
Run Code Online (Sandbox Code Playgroud)
更新2 我按照MATLAB帮助中的说明进行操作,但对我不起作用。对于SupNum = 8,产生了以下结果:
matlab image-processing image-segmentation matlab-coder superpixels
在 Matlab Coder 中运行时,某些函数要求输入为常数。我希望找到一种方法在输入之前将输入声明为常量作为有问题的情况的示例:
function foo = subsubfunction(x,y)
[B,A]=butter(1,x/y);
Run Code Online (Sandbox Code Playgroud)
这将返回错误“所有输入必须是常量”
我如何将x 和 y声明为常量,以便 butter() 开心?我尝试了很多解决方案,但不幸的是没有找到任何真正令人满意的解决方案。如果coder.newtype('constant',x)可以使用命令行操作,它将简化一切。
我正在使用Matlab Coder将一些Matlab代码转换为C++,但是我无法将整数转换为字符串.
int2str()代码生成不支持,所以我必须找到一些其他方法将int转换为字符串.我试过谷歌搜索,没有成功.这甚至可能吗?
我的目标是使用C代码和Matlab代码的混合,并最终通过使用Coder工具在C中运行整个事物.我找到了两种方法将C结合到Matlab中,编写一个Mex文件,并在C程序中使用coder.ceval.
除了调用语法之外,这两种方法有什么区别吗?