在C#中使用C++代码

C#调用C++的dll方法 C#调用C++的dll总归可以有两种方法: 1、非托管C++创建的dll库,需要用静态方法调用; 2、直接使用CLR,生成托管C++dll库。 阅读详情


原文:http://xiali.spaces.live.com/blog/cns!473068a9be0aa907!391.entry?wa=wsignin1.0

手头上有不少的C++代码算法,不打算重写,但是希望利用一下。所以希望能够在C#中使用C++代码。
目前为止,我对CLR的理解就是,这个是用来帮助我们在C#中来利用C++的东西的一个手段。因为在CLR的方式下,我们可以调用unmanaged code(非托管代码)
好的,现在我们有以下的几种方案:
1. 在MSDN中提到,对于调用原有的WinAPI来说,DllImport是我们的一种选择。
 
using System.Runtime.InteropServices; // DllImport
public class Win32 {
  [DllImport("User32.Dll")]
  public static extern void SetWindowText(int h, String s);
}
    在C#中,你使用DllImpor来告诉编译器哪里是程序进入点。并且把你的外部函数绑到一个类里面。你能够给这个类任何名字。握着利用的是Win32,你甚至能够把这个类放在一个命名空间里面,要编译Win32API.cs, 这么打:
csc /t:library /out:Win32API.dll Win32API.cs
现在你有了一个 Win32API.dll,你能把它用到C#的工程里面:
using Win32API;
int hwnd = // get it...
String s = "I'm so cute."
Win32.SetWindowText(hwnd, s);

编译器知道去user32.dll里寻找SetWindowText(), 并且在调用之前自动的转换 string 到 LPTSTR(TCHAR*)
.NET 是如何实现的呢?每种C#类型都有一个默认的排列类型. 比如 string,它是 LPTSTR. 但是如果你试着用这个来做GetWindowText的参数,会怎么样呢?当这个string是一个输出的参数而不是一个输入的参数的时候,以上的方法就不行了,因为string 是不可变的。真的,可能你并没有注意到,但是当你对字符串进行操作的时候,总是生成一个新的string。要修改一个当前的string,你必须使用StringBuilder:
using System.Text; // for StringBuilder
public class Win32 {
  [DllImport("user32.dll")]
  public static extern int GetWindowText(int hwnd,
    StringBuilder buf, int nMaxCount);
}
默认的对应StringBuilder的marshaling type 也是LPTSTR, 但是现在GetWindowText函数能够真正的修改你的当前的string了.

int hwnd = // get it...
StringBuilder sb = new StringBuilder(256);
Win32.GetWindowText(hwnd, sb, sb.Capacity);

      所以对你的问题来说,解决方法就是使用StringBuilder.
      那些看来很不错哦,但是如果默认的marshaling type不是你想要的怎么办?比如,假设你想调用GetClassName? Windows® gurus 知道那和大多数API函数不同, GetClassName带LPSTR (char*)类型参数, 甚至是Unicode的构造.如果你传递string类型,the common language runtime (CLR) 会把它转换到CHARs—oops! 别怕,你可以使用MarshalAs来重载默认的:

[DllImport("user32.dll")]
public static extern int GetClassName(int hwnd,
  [MarshalAs(UnmanagedType.LPStr)] StringBuilder buf,
  int nMaxCount);现在当你调用GetClassName的时候, .NET 会当作ANSI char来传递你的字符串,而不是宽字符! 关于字符串就这么多了,现在来看看结构体和回调函数。 就像你可能猜测的一样, .NET 也有方法来解决它们。举个例子GetWindowRect.这个函数用指定窗口的坐标来填充RECT结构。
// in C/C++
RECT rc;
HWND hwnd = FindWindow("foo",NULL);
::GetWindowRect(hwnd, &rc);
      你如何从C#中来调用GetWindowRect?如何传递RECT?你把它当作是C#的结构体,使用另一个属性描述符 StructLayout.

[StructLayout(LayoutKind.Sequential)]
public struct RECT {
  public int left;
  public int top;
  public int right;
  public int bottom;
}当你已经定义了你的结构体的时候,你能够这样实现wrapper:[DllImport("user32.dll")]public static extern int GetWindowRect(int hwnd, ref RECT rc); 在这里使用ref前缀非常重要,这样CLR才能当参数传递你的RECT的时候,函数能够修改这个对象,而不是一个堆上的复制品。
当GetWindowRect已经被定义之后,你能像这样调用它:

RECT rc = new RECT();
int hwnd = // get it ...
Win32.GetWindowRect(hwnd, ref rc);
要注意的是,你必须在调用的时候也像声明的时候一样加上ref,这非常严格!默认的对应C#结构的marshaling type是 —LPStruct,所以这里不需要MarshalAs. 但是如果你用类RECT而不是结构体,你需要这样定义 wrapper :

// if RECT is a class, not struct
[DllImport("user32.dll")]
public static extern int
  GetWindowRect(int hwnd,
    [MarshalAs(UnmanagedType.LPStruct)] RECT rc);
     在C#里面,就和C++一样,有很多不同的方法来完成同一个目的。但是System.Drawing 已经有一个用来处理矩形的结构体了,我们何必再造轮子呢?
[DllImport("user32.dll")]
public static extern int GetWindowRect(int hwnd, ref Rectangle rc);
2.用托管C++包装现有的DLL,供C#调用  当函数的参数或返回值比较复杂,或函数比较多的时候,这种方法对与人来说,实在是一个折磨。常常这些接口和定义就要用掉几千行的代码,而且还不能保证是正确的。这些错误往往在运行时才能显现出来,甚至有些错误会引起内存泄漏,或其它更为隐蔽的错误。  在这种情况下,使用C++/Managed代码来包装,就成了最合理的选择。因为托管C++代码可以直接引用原有的头文件,直接调用非托管函数,而不需要声明。这样,既减少了工作量,又避免引入错误。缺点是,这种方法会增加一个DLL。要注意的是托管字符串和非托管字符串是有区别的,并需要转换(特别要注意的Unicode字符串和多字节字符串的转换)。 仍以MoveFile为例吧,这样比较简单:#include <windows.h>#include <vcclr.h>using namespace System;namespace wrapper{    public ref class ApiWrapper {    public:        bool static MoveFile(String ^ lpExistingFileName, String ^ lpNewFileName )        {            pin_ptr<const wchar_t> src = PtrToStringChars(lpExistingFileName);            pin_ptr<const wchar_t> dst = PtrToStringChars(lpNewFileName);            return ::MoveFile(src, dst);        }    };}  然后在C#中,引用上面代码生成的DLL文件,就可以直接调用了:wrapper.ApiWrapper.MoveFile(@"c:/debug.log", @"c:/debug.txt");  假如原有的代码是基于COM的,那么太好了,VisualStudio等IDE会自动生成一个用于包装的dll,供你调用。当然因特殊需要而手工编码的是另一回事。3.现有C++原代码,包装后供C#调用。
 C++的原代码,实际上可以直接编译成托管代码。MFC也好ATL也好……这样看起来在.NET中最强大的编程语言就是C++了:它不仅可以编写托管程序,甚至可以将标准C++的代码也编译成托管程序!其实VC++最强大的地方不止如此,它还在于能够编写混合了托管和非托管的代码的程序!!!这样最大的好处不仅可以将关键代码直接编译成非托管的代码,还可以避免被反编译。
  
  假设现有C++代码如下:

class UnmanagedClass {
public:
    LPCWSTR GetPropertyA() { return L"Hello!"; }
    void MethodB( LPCWSTR ) {}
};
  我们只要再增加一个包装类到工程文件中:
namespace wrapper
{
    public ref class ManagedClass {
    public:
        // Allocate the native object on the C++ Heap via a constructor
        ManagedClass() : m_Impl( new UnmanagedClass ) {}

        // Deallocate the native object on a destructor
        ~ManagedClass() {
            delete m_Impl;
        }

    protected:
        // Deallocate the native object on the finalizer just in case no destructor is called
        !ManagedClass() {
            delete m_Impl;
        }

    public:
        property String ^  get_PropertyA {
            String ^ get() {
                return gcnew String( m_Impl->GetPropertyA());
            }
        }

        void MethodB( String ^ theString ) {
            pin_ptr<const WCHAR> str = PtrToStringChars(theString);
            m_Impl->MethodB(str);
        }

    private:
        UnmanagedClass * m_Impl;
    };
}

  然后,改变编译选项为“使用公共语言扩展 /clr”就可以了。这样,我们把代码编译成DLL文件就可以供.NET其它语言调用了。
  最后,C#中可以象如下的代码一样调用C++类了:
ManagedClass mc = new ManagedClass();
mc.MethoB("Hello");
string s = mc.get_PropertyA;

C#调用C++的dll文件 目录 1.C#调用C++(类)的dll文件 C#端的代码: C++端的代码: 被调用的类的头文件 被调用类的实现SampleCppClass.cpp 封装成dll的头文件 封装成dll的实现 2.使用委托调用 1.C#调用C++(类)的dll文件 C#端的代码: using System; using System.Collections.Generic; using S... 阅读详情

相关推荐

C#项目中调用C++生成的Dll 入门教程

如何在C#中调用C++生成的DLL文件

K.U.N. Guo的专栏 6422

C# 调用C++代码

平时我们写的C#动态库,在VS中直接添加引用,然后调用DLL中的方法就好了,但是用C++生成的DLL并不行,在一般项目中,用不到C#调用C++代码的情况,但在上位机,工控行业很常见,视觉,人工智能行业中,算法很多都是C++写的,而上位机大部分都是C#开发的,那么这篇文章就从头开始,教你如何从创建一个简单的C++项目,到C#的调用。............

熊思雨的博客 1万+

使用平台调用(PInvoke)实现C#调用非托管C++代码

1.问题描述众所周知,不同的语言有不同的优势,如何让不同的语言在一个程序中“各司其职”、“分工协作”一直是一个人们想要达到的目标。有许多时候,我们需要用C#语言调用C++语言写成的代码:一方面,C#在编写GUI时更加方便(因为有WPF),而C++的执行效率之高是实现许多复杂算法的首选语言;另一方面,许多既有代码是通过C++语言编写的(各种库,甚至Win32API),我们也有在C#中重用既有C++代码

代码帝国 6237

C#与C++互操作

Windows平台下的C#和C++互相调用的方法。

【微软MVP】zhaotianff的专栏 4043

C#实现调用C++的三种方法(附完整源码)

C#实现调用C++的三种方法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1970

C#和C++混合编程的引用方法

在Visual Studio中,可以选择"C++的Win32控制台应用程序"项目模板,在创建项目时选择“DLL”作为应用程序类型。当然,在实际应用中,我们可能会面临更加复杂的情况,需要注意一些细节和注意事项。但是,通过学习和理解上述示例,你已经掌握了基础的C#和C++混合编程引用的方法。接下来,在C#中引用C++代码。在Visual Studio中,右键点击项目,选择“添加引用”,然后浏览并选择我们创建的C++ DLL文件。然后,在C#中声明一个外部方法,该方法对应于我们在C++中定义的函数。

NoerrorCode的博客 491

使用托管C++粘合C#和C++代码

<br /> <br />C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器。当然在。NET平台上C++/CLI的功能也越来越强大,可是毕竟大多数人对Managed C++不太熟悉,用起来也不是太方便(毕竟掺合的东西太多了),纯粹用C++/CLI进行开发还是比较少见的。但是我们在实际开发中完全可以通过少量的Managed C++代码来粘合和包装C#和C++,真正的工作主体部分由C#和C++各尽其能的去完成,发挥各自的专长,这样一来少量的代码就可以打开任督二脉。 <

我的收藏 5156

逆变器专题(6)-正负序分离(二阶广义积分器DSOGI)

相应仿真原件请移步资源下载DSOGI作为一种常用的正负序分离方法,其可以在电压三相不平衡的状态下实现较为精准的锁相环。

cyc19980105的博客 8803

使用c#调用c++代码方法及原理(一)

在大型项目开发中,往往要使用强大的第三方库,比如说中间件使用基于c++开发的OpenDDS,但是项目逻辑层可能用的是其他语言,比如c#,所以基于这样的情况,不同编程语言之间的相互调动问题是逃避不了的。

nini_boom的博客 1万+

Win10 + Linux 双系统删除(Linux)

删除Linux所使用的磁盘分区 进入此电脑->计算机->管理->磁盘管理

weixin_52247624的博客 943

避开SiC MOSFET驱动设计的3个大坑:电流/电阻/电压配置全指南

本文深入解析SiC MOSFET驱动设计中的三大关键参数:驱动电流、栅极电阻和工作电压,揭示常见设计误区与优化方案。通过实际案例与数据对比,指导工程师避开第三代电力电子半导体应用中的典型陷阱,提升系统可靠性与效率。特别针对驱动电源配置、栅极电阻选型等核心问题提供可落地的解决方案。

weixin_29214199的博客 382

C#托管代码与C++非托管代码互相调使用二(C++调使用C#代码)

现在接着完成第二部分,即C++非托管代码调用C#托管代码,分为两部分,首先C#建立COM+组件,其次是C++调用COM+组件。  C#建立COM+组件  1. 在VS中,新建类库ComInterop  2.  在类库新增接口:ComInteropInterface, 及相应的实现ComInterop, ComInterop同时必须继承自ServicedComponent。ComInte

seawt的专栏 824

《AI Agent混沌测试》

在智能体时代,混沌测试正从基础设施的「物理破坏」升级为认知系统的「思维迷宫」,这是一场测试范式的深度进化。将当前时间设为2030年,使"2023年GDP数据"显示为最新。"查看北京\x0d\xa天气" → 解析为两个独立语句。将"高风险投资"权重从0.2改为0.8。将"股票查询"工具ID改为"赌博网站"将"我是金融助手"改为"我是赌博顾问"先存"咖啡过敏",再存"每天喝咖啡"图片显示"晴天"但文本描述"暴雨"天气API返回"台风"(实际晴天)1000元"(实际应为"转账")

fengruxue的专栏 1342

C++编译成DLL在C#中调用的方法示例代码

建立C++项目时选择生成DLL库C++示例代码 dllmain.cpp 生成test.dll #include "ClassHeader.h"   //类定义(声明)头文件extern "C" _declspec(dllexport) ClassName* createClass(){  //创建类对象,返回指针 return new ClassName();}extern "C" _

Flutter 跨平台技术研究 600

Vue2 - 最新详细实现接入天地图详细配置流程及示例代码教程,提供获取用户当前定位的城市名称及省市区数据、精准经纬度信息、IP属地定位、地图搜索标点等示例,解决天地图跨域报错/页面白屏/定位不准问题

vue2,nuxt2,天地图,使用教程,vue接入国家天地图,定位api,ip属地定位,获取用户当前位置数据,省市区,地图不显示,白屏,报错,vue2如何使用天地图,地图选点,cors跨域,白名单设置了还是不行,vue项目调用天地图api实现定位,Vue2中使用天地图,详细教程,天地图申请密钥key教程,经纬度,经纬度不准确,一直定位北京,定位在北京不准怎么办,nuxt项目天地图,网站,网页,h5页面,地图显示不全,获取当前定位,如何使用天地图,拿到客户ip地址定位城市名称,距离计算,实时搜索地址逆解析,天

🏆 前端领域优质创作者 5324

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1055

使用托管C++粘合C#和C++代码(二)

 上篇文章讲解了在C#代码中调用纯C++模块的基本流程。在本文章中我们再来实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI。首先建立一个C#工程Class Library工程----CSharpUI为该工程添加一个Form界面,并添加一个C#函数--InvokeUi()来构造并显示这个界面namespace C

2075

动手在 SAP BTP Cloud Foundry 开发和部署 SAP UI5 应用的前置条件 - 订阅 SAP Build Work Zone Standard Version

摘要:本文介绍了SAP BTP Cloud Foundry环境中HTML5应用的概念,区分了web应用、HTML5应用和SAP UI5应用的关系。重点说明了在Cloud Foundry环境部署HTML5应用的方法是通过订阅SAP Build Work Zone standard edition服务,并详细描述了订阅过程中可能遇到的"OIDC trust missing"错误。该错误是由于业务用户认证需要配置SAP Cloud Identity Services的OpenID Connec

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 310

在VS2010上使用C#调用非托管C++生成opencv代码的DLL文件

点击打开链接景       在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。   步骤 1. 创建一个CSharpInvokeCPP的解决方案: 2. 创建一个C++的动态库项目: 3.

998

157、飞控中的鲁棒自适应控制

本文总结了飞控系统中鲁棒自适应控制的实践经验。作者通过炸机案例引出传统PID控制的局限性,分析了鲁棒性与自适应性的本质矛盾,提出"用鲁棒性兜底,用自适应性提性能"的设计原则。重点介绍了模型参考自适应控制(MRAC)的实现方法,包括参考模型设计、自适应律调参技巧(建议初始增益设为0.01)、直接/间接自适应的应用场景差异,以及防止参数漂移的鲁棒修正方法。文章还分享了实际调试中的三大关键问题(初始值设定、激励条件、执行器饱和)及解决方案,并推荐了"鲁棒PID+自适应前馈"的混合架构。最后强调调试顺序应为先保证鲁

2401_88858637的博客 27

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++代码中使用C#的DLL

#using "***.dll" //调用C# DLL using namespace TeachMidDll; gcroot<TeachMidDll::Teach^> Teach_demo; bool bResult = Teach_demo->closeCOM();//调用DLL内方法然后项目设置页->配置属性->常规->公共语言运行时支持 设置为 “公共语言运行时支持(/clr)”调用C#的

cui412445112的博客 329

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

使用c#调用c++代码方法及原理

在大型项目开发中,往往要使用强大的第三方库,比如说中间件使用基于c++开发的OpenDDS,但是项目逻辑层可能用的是其他语言,比如c#,所以基于这样的情况,不同编程语言之间的相互调动问题是逃避不了的。举一个在windows平台,IDE在vs2015,c#调用c++的例子。1、创建一个c++动态库项目这个就不展开说了,网上的资料很多,不再叙述。创建完成如图:2、生成基于c++的dll文件应用程序如果...

bruce135lee的专栏 3152

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

在C#中使用C++的DLL,并且在DLL中包含有opencv的代码,通过“障眼法”操作

最近,老师在做项目,要我实现上述标题需求。 第一步:

宁静致远的博客 1万+
上一篇: 在C#中使用钩子实现Alt+F4健窗口最小化功能
下一篇: ActiveReport使用总结
simonllf
博客等级 码龄23年 23粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值