matlab和c的调用问题

matlab和c的调用问题,第1张

当一个MEX文件正在运行时发生了出错。 如果这个MEX文件不是一个官方文件的函数,就请检查他源代码的错误。 请请教外部的接口针对数据的导引调试该MEX文件。

如果它是一个官方的 MathWorks 函数

对MathWorks 的这一个问题方面遵从这些步骤

我们有改正它的最好机会:

1 为自动化的分析送这一项毁坏报告给 segv@mathworkscom 。

对于你的方便,这数据已经被记录在:

C:\ DOCUME~1\ xs\ LOCALS~1\ Temp\ matlab_crash_dump3924

2 同时, 如果问题是可再次出现的,发送破坏的数据给

support@mathworkscom 向前由于:

- 一本将会再生问题的步骤特定目录

- 必需再生问题的任何 M ,MEX, MDL 或其他的文件

- 任何的错误信息在破坏报告上有所体现。

一个有技术且支持你的工程师将会连络你。

function test_targets = C4_5(train_patterns, train_targets, test_patterns, inc_node, Nu)

% Classify using Quinlan's C45 algorithm

% Inputs:

% training_patterns - Train patterns 模式

% training_targets - Train targets 目标

% test_patterns - Test patterns 测试模式

% inc_node - Percentage of incorrectly assigned samples at a node

% 一个节点中不正确的样本分配比例

% Outputs

% test_targets - Predicted targets 预测目标

%NOTE: In this implementation it is assumed that a pattern vector with fewer than 10 unique values (the parameter Nu)

%is discrete, and will be treated as such Other vectors will be treated as continuous

[Ni, M] = size(train_patterns);

inc_node = inc_nodeM/100;

%Find which of the input patterns are discrete, and discretisize the corresponding

%dimension on the test patterns

discrete_dim = zeros(1,Ni);

for i = 1:Ni,

Ub = unique(train_patterns(i,:));%获得第i行中不重复的元素构成的向量

Nb = length(Ub);

if (Nb <= Nu),

%This is a discrete pattern 这是一个离散的模式

discrete_dim(i) = Nb;

dist = abs(ones(Nb ,1)test_patterns(i,:) - Ub'ones(1, size(test_patterns,2)));

[m, in] = min(dist);

test_patterns(i,:) = Ub(in);

end

end

%Build the tree recursively

%disp('Building tree')

tree = make_tree(train_patterns, train_targets, inc_node, discrete_dim, max(discrete_dim), 0);

%Classify test samples

%disp('Classify test samples using the tree')

test_targets = use_tree(test_patterns, 1:size(test_patterns,2), tree, discrete_dim, unique(train_targets));

%END

function targets = use_tree(patterns, indices, tree, discrete_dim, Uc)

%Classify recursively using a tree

targets = zeros(1, size(patterns,2));

if (treedim == 0)

%Reached the end of the tree

targets(indices) = treechild;

return

end

%This is not the last level of the tree, so:

%First, find the dimension we are to work on

dim = treedim;

dims= 1:size(patterns,1);

%And classify according to it

if (discrete_dim(dim) == 0),

%Continuous pattern

in = indices(find(patterns(dim, indices) <= treesplit_loc));

targets = targets + use_tree(patterns(dims, :), in, treechild(1), discrete_dim(dims), Uc);

in = indices(find(patterns(dim, indices) > treesplit_loc));

targets = targets + use_tree(patterns(dims, :), in, treechild(2), discrete_dim(dims), Uc);

else

%Discrete pattern

Uf = unique(patterns(dim,:));

for i = 1:length(Uf),

if any(Uf(i) == treeNf) %Has this sort of data appeared before If not, do nothing

in = indices(find(patterns(dim, indices) == Uf(i)));

targets = targets + use_tree(patterns(dims, :), in, treechild(find(Uf(i)==treeNf)), discrete_dim(dims), Uc);

end

end

end

%END use_tree

function tree = make_tree(patterns, targets, inc_node, discrete_dim, maxNbin, base)

%Build a tree recursively

[Ni, L] = size(patterns);

Uc = unique(targets);

treedim = 0;

%treechild(1:maxNbin) = zeros(1,maxNbin);

treesplit_loc = inf;

if isempty(patterns),

return

end

%When to stop: If the dimension is one or the number of examples is small

if ((inc_node > L) | (L == 1) | (length(Uc) == 1)),

H = hist(targets, length(Uc));

[m, largest] = max(H);

treeNf = [];

treesplit_loc = [];

treechild = Uc(largest);

return

end

%Compute the node's I

for i = 1:length(Uc),

Pnode(i) = length(find(targets == Uc(i))) / L;

end

Inode = -sum(Pnodelog(Pnode)/log(2));

%For each dimension, compute the gain ratio impurity

%This is done separately for discrete and continuous patterns

delta_Ib = zeros(1, Ni);

split_loc = ones(1, Ni)inf;

for i = 1:Ni,

data = patterns(i,:);

Ud = unique(data);

Nbins = length(Ud);

if (discrete_dim(i)),

%This is a discrete pattern

P = zeros(length(Uc), Nbins);

for j = 1:length(Uc),

for k = 1:Nbins,

indices = find((targets == Uc(j)) & (patterns(i,:) == Ud(k)));

P(j,k) = length(indices);

end

end

Pk = sum(P);

P = P/L;

Pk = Pk/sum(Pk);

info = sum(-Plog(eps+P)/log(2));

delta_Ib(i) = (Inode-sum(Pkinfo))/-sum(Pklog(eps+Pk)/log(2));

else

%This is a continuous pattern

P = zeros(length(Uc), 2);

%Sort the patterns

[sorted_data, indices] = sort(data);

sorted_targets = targets(indices);

%Calculate the information for each possible split

I = zeros(1, L-1);

for j = 1:L-1,

%for k =1:length(Uc),

% P(k,1) = sum(sorted_targets(1:j) == Uc(k));

% P(k,2) = sum(sorted_targets(j+1:end) == Uc(k));

%end

P(:, 1) = hist(sorted_targets(1:j) , Uc);

P(:, 2) = hist(sorted_targets(j+1:end) , Uc);

Ps = sum(P)/L;

P = P/L;

Pk = sum(P);

P1 = repmat(Pk, length(Uc), 1);

P1 = P1 + eps(P1==0);

info = sum(-Plog(eps+P/P1)/log(2));

I(j) = Inode - sum(infoPs);

end

[delta_Ib(i), s] = max(I);

split_loc(i) = sorted_data(s);

end

end

%Find the dimension minimizing delta_Ib

[m, dim] = max(delta_Ib);

dims = 1:Ni;

treedim = dim;

%Split along the 'dim' dimension

Nf = unique(patterns(dim,:));

Nbins = length(Nf);

treeNf = Nf;

treesplit_loc = split_loc(dim);

%If only one value remains for this pattern, one cannot split it

if (Nbins == 1)

H = hist(targets, length(Uc));

[m, largest] = max(H);

treeNf = [];

treesplit_loc = [];

treechild = Uc(largest);

return

end

if (discrete_dim(dim)),

%Discrete pattern

for i = 1:Nbins,

indices = find(patterns(dim, :) == Nf(i));

treechild(i) = make_tree(patterns(dims, indices), targets(indices), inc_node, discrete_dim(dims), maxNbin, base);

end

else

%Continuous pattern

indices1 = find(patterns(dim,:) <= split_loc(dim));

indices2 = find(patterns(dim,:) > split_loc(dim));

if ~(isempty(indices1) | isempty(indices2))

treechild(1) = make_tree(patterns(dims, indices1), targets(indices1), inc_node, discrete_dim(dims), maxNbin, base+1);

treechild(2) = make_tree(patterns(dims, indices2), targets(indices2), inc_node, discrete_dim(dims), maxNbin, base+1);

else

H = hist(targets, length(Uc));

[m, largest] = max(H);

treechild = Uc(largest);

treedim = 0;

end

end

这是该题的程序,请给出调用举例~~~急~

如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:

double add(double x, double y) {

return x + y;

}

现在我想要在Matlab中使用它,比如输入:

>> a = add(11, 22)

33000

要得出以上的结果,那应该怎样做呢?

解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。

可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的 *** 作,包含在mexFunction这个函数中,由使用者具体设定。

所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的11和22)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。

比如该C文件已写好,名为addc。那么在Matlab中,输入:

>> mex addc

就能把addc编译为MEX文件(编译器的设置使用指令mex -setup),在Windows中,MEX文件类型为mexw32,即现在我们得出addmexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。

我们现在来说mexFunction怎样写。

mexFunction的定义为:

void mexFunction(

int nlhs,

mxArray plhs[],

int nrhs,

const mxArray prhs[]) {

}

可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:

>> b = 11; c = 22;

>> a = add(b, c)

mexFunction四个参数的意思为:

nlhs = 1,说明调用语句左手面(lhs-left hand side)有一个变量,即a。

nrhs = 2,说明调用语句右手面(rhs-right hand side)有两个自变量,即b和c。

plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a。

prhs和plhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指针数组,即不能改变其指向内容。

因为Matlab最基本的单元为array,无论是什么类型也好,如有double array、 cell array、 struct array……所以a,b,c都是array,b = 11便是一个1x1的double array。而在C语言中,Matlab的array使用mxArray类型来表示。所以就不难明白为什么plhs和prhs都是指向mxArray类型的指针数组。

完整的addc如下:

// addc

#include "mexh" // 使用MEX文件必须包含的头文件

// 执行具体工作的C函数

double add(double x, double y) {

return x + y;

}

// MEX文件接口函数

void mexFunction(

int nlhs,

mxArray plhs[],

int nrhs,

const mxArray prhs[]) {

double a;

double b, c;

plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);

a = mxGetPr(plhs[0]);

b = (mxGetPr(prhs[0]));

c = (mxGetPr(prhs[1]));

a = add(b, c);

}

mexFunction的内容是什么意思呢?我们知道,如果这样调用函数时:

>> output = add(11, 22);

在未涉及具体的计算时,output的值是未知的,是未赋值的。所以在具体的程序中,我们建立一个1x1的实double矩阵(使用mxCreateDoubleMatrix函数,其返回指向刚建立的mxArray的指针),然后令plhs[0]指向它。接着令指针a指向plhs[0]所指向的mxArray的第一个元素(使用mxGetPr函数,返回指向mxArray的首元素的指针)。同样地,我们把prhs[0]和prhs[1]所指向的元素(即11和22)取出来赋给b和c。于是我们可以把b和c作自变量传给函数add,得出给果赋给指针a所指向的mxArray中的元素。因为a是指向plhs[0]所指向的mxArray的元素,所以最后作输出时,plhs[0]所指向的mxArray赋值给output,则output便是已计算好的结果了。

上面说的一大堆指向这指向那,什么mxArray,初学者肯定都会被弄到头晕眼花了。很抱歉,要搞清楚这些乱糟糟的关系,只有多看多练。

实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保

输入正确。如在add函数的例子中,用户输入char array便是一种错误了。

从上面的讲述中我们总结出,MEX文件实现了一种接口,把C语言中的计算结果适当地返回给Matlab罢了。当我们已经有用C编写的大型程序时,大可不必在Matlab里重写,只写个接口,做成MEX文件就成了。另外,在Matlab程序中的部份计算瓶颈(如循环),可通过MEX文件用C语言实现,以提高计算速度。

以上就是关于matlab和c的调用问题全部的内容,包括:matlab和c的调用问题、谁能告诉我matlab程序c4.5算法怎么调用吗下面是程序代码,告诉我怎么调用(具体的使用举例)、matlab怎么和c语言链接等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9330391.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存