Matlab编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab编程相关的知识,希望对你有一定的参考价值。

参考技术A 看下这个程序function main() %主要思想是从两幅图像中选取信息,然后置乱成一幅图像。 %这样可以从要加密的多幅(2*n幅)图像中,按照上述思想,得到一半数目(n幅)的图像。 %对得到的图像进行自适应算法的隐藏,又可以得到(n-1)幅的图像。 %对(n-1)幅的图像进行Arnold变换,得到(n-1)幅的图像作为密钥,此外,密钥还有迭代次数,置乱规则,Arnold加密规则 %主要缺点是Arnold的周期较大,程序的运行的时间长些,我的电脑需要8分钟,另外,Arnold只能处理方阵 %图像的置乱加密算法很多,本程序中用到的置乱加密算法只是其中一种方法,仅仅提出一个多幅图像加密的思想,后期还有许多的工作要做。 %读入四幅图像 F1 = imread('lena.gif'); F2 = imread('monkey.gif'); F3 = imread('house.gif'); F4 = imread('cameraman.gif'); %对图像的置乱 pic1_zhiluan = zhiluan(F1,F2); pic2_zhiluan = zhiluan(F3,F4); %显示置乱后的图像 pic1_zhiluan = uint8(pic1_zhiluan); figure,imshow(pic1_zhiluan),title('pic1 zhiluan') pic2_zhiluan = uint8(pic2_zhiluan); figure,imshow(pic2_zhiluan),title('pic2 zhiluan') %将两幅置乱图像进行隐藏 X1 = input('请输入一个混合迭代参数:'); pic1_hide = hide(pic1_zhiluan,X1,pic2_zhiluan); %对隐藏后的图像进行Arnold置乱加密 diedai1 = input('请输入一个迭代的参数:') pic1_jiami = Arnold(pic1_hide,diedai1,0); %显示加密后的图像 pic1_jiami = uint8(pic1_jiami); figure,imshow(pic1_jiami),title('pic1 jiami') diedai2 = input('请输入一个迭代的参数:') pic2_jiami = Arnold(pic2_zhiluan,diedai2,0); pic2_jiami = uint8(pic2_jiami); figure,imshow(pic2_jiami),title('pic2 jiami') %解密图像 pic1_jiemi = Arnold(pic1_jiami,diedai1,1); pic2_jiemi = Arnold(pic2_jiami,diedai2,1); %恢复隐藏后的图像 pic1_huifu = huifu(pic1_jiemi,X1,pic2_jiemi); %置乱的逆处理,得到恢复后的图像 [image1,image2] = ni_zhiluan(pic1_huifu); [image3,image4] = ni_zhiluan(pic2_jiemi); %显示各个图像 F1 = uint8(F1); figure,imshow(F1),title('F1'); figure,imhist(F1),title('F1的直方图'); image1 = uint8(image1); figure,imshow(image1),title('image1'); figure,imhist(image1),title('image1的直方图'); F2 = uint8(F2); figure,imshow(F2),title('F2'); figure,imhist(F2),title('F2的直方图'); image2 = uint8(image2); figure,imshow(image2),title('image2'); figure,imhist(image2),title('image2的直方图'); F3 = uint8(F3); figure,imshow(F3),title('F3'); figure,imhist(F3),title('F3的直方图'); image3 = uint8(image3); figure,imshow(image3),title('image3'); figure,imhist(image3),title('image3的直方图'); F4 = uint8(F4); figure,imshow(F4),title('F4'); figure,imhist(F4),title('F4的直方图'); image4 = uint8(image4); figure,imshow(image4),title('image4'); figure,imhist(image4),title('image4的直方图'追问

能有简单的程序吗?!!!

matlab与vs混合编程/matlab移植

前言

  项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程。

在matlab中将.m文件编译生成库文件等供外部的vs程序调用,实现混合编程。

实现步骤

1.matlab中算法代码编译生成库文件、头文件等;

2.创建并配置VS工程;

3.安装配置MCR方便软件移植;

实现环境

matlab版本:matlab2015a

vs版本:vs2013

PC系统:win7_x64

实现过程

1.matlab中算法代码编译生成库文件、头文件等;

1)在matlab写一个测试代码(一般是系统算法对应matlab函数);

function [sum, prod] = sum_prod(p1, p2)
sum = p1+p2;
prod = p1.*p2;
end

2)生成库文件、头文件等;

方法有两种,一种是使用matlab命令行,一种是使用matlab菜单栏工具。本文使用的是第二种方法。

方法一:

(1)在命令行输入命令!mcc查看是否带有mcc编译器;

(2)命令窗口输入mbuild -setup选择要使用的c++编译器,本文选择的是mex -setup C++ -client MBUILD 编译器;

 

(3)命令窗口输入deploytool命令,剩余步骤参考方法二;

方法二:

(1)matlab命令行输入deploytool即可;

(2)输入deploytool命令之后出现以下对话框,选择Library Compiler选项;

(3)按照下图指示步骤生成文件;

 

(4)生成的文件夹如下图,所需要的库文件、头文件在for_redistribution_files_only文件夹中;

 

(5)将相关库文件、头文件复制到VS工程目录下;

 

2.创建并配置VS工程;

1)创建VS工程,新建源文件作为测试;

#include <iostream>
#include "sum_prod.h"
#include "mclmcrrt.h"
#include "mclcppclass.h"

#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"sum_prod.lib")

using namespace std;

int main()
{
    if (!sum_prodInitialize())  //必须写
    {
        //cout << "初始化失败!" << endl;
        return -1;
    }
    double p[2][2] = { 1, 2, 3, 4 };
    mwArray X(2, 2, mxDOUBLE_CLASS);
    mwArray Y(2, 2, mxDOUBLE_CLASS);
    mwArray SUM(2, 2, mxDOUBLE_CLASS);
    mwArray PROD(2, 2, mxDOUBLE_CLASS);
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            X(i + 1, j + 1) = p[i][j];
            Y(i + 1, j + 1) = p[i][j];
        }
    }
    sum_prod(2, SUM, PROD, X, Y);

    double  sum[2][2], prod[2][2];
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            sum[i][j] = SUM(i + 1, j + 1);
            prod[i][j] = PROD(i + 1, j + 1);
        }
    }
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << sum[i][j];
        }
        cout << endl;
    }
    cout << endl;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << prod[i][j];
        }
        cout << endl;
    }
    cout << endl;
    system("pause");
    return 0;
}

2)配置VS工程;

(1)配置matlab的属性(博客中使用的是matlab2015a版本);

项目属性VC++目录选型中添加包含目录和库目录;

包含目录:C:\\Program Files\\MATLAB\\MATLAB Production Server\\R2015a\\extern\\include;

库目录:C:\\Program Files\\MATLAB\\MATLAB Production Server\\R2015a\\extern\\lib\\win64\\microsoft;

(2)链接器输入选项添加附加依赖项;

mclmcrrt.lib;

sum_prod.lib

另一种方法是直接在源文件中添加语句;

#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"sum_prod.lib")

注意:

不同的源文件对应的lib可能会有不同;

一般如果缺少lib的话会出现如下图所示的报错信息;

(3)另,直接将打印信息输出到控制台,将会占用内存,可以使用下图所示的方法将打印信息保存在txt文件中;

打开cmd,定位到可执行文件所在目录,按照下图操作即可得到日志文件log.txt;

 

3.安装配置MCR方便软件移植;

要想在没有安装matlab的电脑上运行matlab程序,不想安装matlab,需要安装MCR编译器;

1)MCR安装程序;

(1)官网math上下载;

(2)在matlab安装目录下复制;

文件目录:(我的是C:\\Program Files\\MATLAB\\MATLAB Production Server\\R2015a\\toolbox\\compiler\\deploy\\win64)

.\\R2015a\\toolbox\\compiler\\deploy\\win64;

 

2)安装MCR编译器;

(1)点击安装MCRInstaller.exe;

(2)创建安装目录;

(3)开始安装,接受许可条款;

(4)选择安装路径,等待安装完成即可;

  本文使用的是默认安装;

3)配置环境变量;

安装完成之后需要将MCR编译器安装目录添加到系统环境变量中;

(1)我的电脑>属性>高级系统设置;

 

(2)在系统属性高级中点击环境变量;

 

(3)系统变量中新建环境变量;

(4)编辑添加系统变量;

变量值就是MCR安装目录(本文默认目录C:\\Program Files\\MATLAB\\MATLAB Runtime\\v85\\runtime\\win64);

参考

1.混合编程:http://blog.csdn.net/wind_liang/article/details/51402224

2.MCR安装:https://jingyan.baidu.com/article/19020a0a057462529d2842d6.html

3.http://blog.csdn.net/sjhuangx/article/details/49305237

做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。

以上是关于Matlab编程的主要内容,如果未能解决你的问题,请参考以下文章

初识MATLAB之编程基础一

MATLAB编程与应用系列-关于MATLAB编程入门教程的总体编写安排

matlab与vs混合编程/matlab移植

Matlab编程Matlab让电脑失而复得

求编程达人帮忙用matlab编程用龙格库塔方法解微分方程

Matlab编程