
题主提供的代码没有错误,但运行时出错,其问题在于,题主把自定义函数与主程序的运行顺序搞反了。
方法1、分别将y1=Q(r)、y2=R(q)和y3=S(r)自定义函数保存为Qm、Rm和Sm文件,再将主程序保存为mainm文件,然后在命令窗口中,执行 >>main %回车
方法2、建立mainm文件,按下列顺序书写程序
①主程序
function main( )
clear;clc;
format short
。。。。。。
disp([r',theta'])
②Q(r)自定义函数、R(q)自定义函数和S(q)自定义函数
function y1=Q(r)
c1=27132e15;
。。。。。。。
function y2=R(q)
y2=q;
function y3=S(r)
c1=27132e15;
。。。。。。。
最后执行可得
I = imread('图1jpg'); //读入图像
I = rgb2gray(I); //灰度变换
m = mean2(I); //计算平均灰度值
s = find(I < m 075); //查找小于075倍平均灰度元素位置
I1 = ones(size(I,1), size(I,2)) 255; //生成与I同维矩阵,矩阵元素值均为255
I1(s) = 0; //s位置(小于075倍平均灰度元素位置)元素赋为0
subplot(1,2,1), imshow(I); //生成1行2列窗口,窗口1显示图像I
subplot(1,2,2), imshow(I1); //生成1行2列窗口,窗口2显示图像I1
total = size(I, 1) size(I, 2); //I的行数与列数相乘,其值赋给total
num = size(s, 1); //s的行数赋给num
result = num / total; //结果
您好,这样的:
闲着没事的做法是,使用save mat的命令,想查看的时候,load mat就可以了。
再就是设置全局变量,子程序中想要用的变量弄成全局变量。
这段代码不要再命令窗口中写,而是在M文件的Editor建立一个文件,只写前三行,比如保存为testadd把,而把function及其下一行放在令一个文件中,直接保存,文件名千万别改,执行testadd应该就没问题了。
把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。
下面是这个例子用到的m代码。它定义了一个名为myadd2的函数
function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2b;
end
复制代码
首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:
mcc -W cpplib:libmyadd2 -T link:lib myadd2
复制代码
结果,我们将会得到包含libmyadd2dll,libmyadd2ctf,libmyadd2h,libmyadd2lib等在内的一些文件。接下来我们只需要这四个文件。
然后在VS2005中创建一个Win32 Console的VC++工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC++工程的源代码所在目录。
接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VS2005中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。
在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-->;Properties,在出来的对话框上,把MATLAB提供的include路径加到VC++的头文件搜索路径。
然后把相应的lib所在目录加到linker的额外搜索路径上
接下来,告诉VC++,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2lib和mclmcrrtlib。中间用空格隔开
最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。
#include "stdafxh"
#include <iostream>
#include "mclmcrh"
#include "mclcppclassh"
#include "libmyadd2h"
int _tmain(int argc, _TCHAR argv[])
{
std::cout << "Hello world!" << std::endl;
/ Initialize the MCR /
if( !mclInitializeApplication(NULL,0) )
{
std::cout << "Could not initialize the application!" << std::endl;
return -1;
}
// initialize lib
if( !libmyadd2Initialize())
{
std::cout << "Could not initialize libmyadd2!" << std::endl;
return -1;
}
try
{
// declare and initialize a
mwArray a(2, 2, mxDOUBLE_CLASS);
double aData;
aData = new double[4];
复制代码
本帖隐藏的内容
int i;
for( i=0; i<4; ++i)
{
aData = 10i;
}
// print output
std::cout << "a = " << std::endl;
std::cout << aData[0] << ",\t" << aData[1] << std::endl;
std::cout << aData[2] << ",\t" << aData[3] << std::endl;
aSetData(aData, 4);
// declare and initialize b
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1,1) = 11;
b(1,2) = 12;
b(2,1) = 21;
b(2,2) = 22;
mwArray y(2, 2, mxDOUBLE_CLASS);
mwArray z(2, 2, mxDOUBLE_CLASS);
// call the function
myadd2(2, y, z, a, b);
// copy data from mwArray to C++ objects
// allocate outputs
double yData, zData;
yData = new double[4];
复制代码
if( yData == NULL )
{
std::cout << "Failed to allocate memory for yData!" << std::endl;
return -1;
}
zData = new double[4];
if( zData == NULL )
{
std::cout << "Failed to allocate memory for zData!" << std::endl;
return -1;
}
// copy data from mwArray to C++
yGetData(yData, 4);
zGetData(zData, 4);
// print output
std::cout << "y = " << std::endl;
std::cout << yData[0] << ",\t" << yData[1] << std::endl;
std::cout << yData[2] << ",\t" << yData[3] << std::endl;
std::cout << "z = " << std::endl;
std::cout << zData[0] << ",\t" << zData[1] << std::endl;
std::cout << zData[2] << ",\t" << zData[3] << std::endl;
// deallocate memory
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( const mwException& e)
{
std::cerr << ewhat() << std::endl;
}
// terminate the lib
libmyadd2Terminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
以上就是关于MATLAB程序出错了,怎么样修改全部的内容,包括:MATLAB程序出错了,怎么样修改、请帮忙解释下MATLAB小程序各句含义(图像识别)、matlab子程序应用主程序变量的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)