• MATLAB读取CCS保存的数据


    转自:http://blog.sina.com.cn/s/blog_640bcc390100pt94.html

    平时只是在simulink下把数据保存到workspace中处理,也就是.mat格式的数据,而CCS下保存的数据格式是.dat的,是十六进制,所以不能直接用load命令来处理,研究了也下,同过下面的方法可以实现。
    % dat文件是由CCS保存的数据文件
    clc;clear all;close all;
    I = importdata('11.dat');    
    [M,N] = size(I);
    B=cell2mat(I);
    %计算
    aa=B(:,3:6)
    bb=hex2dec(aa)
    plot(bb)
    [m,n]=find(max(aa))
    cc=hex2dec(aa(1,:))
    max(bb)

     

     

    //////////////////////////////////////////////////////////////////////////

    如何将下面形式的dat文件内容用c语言读入到二维数组中?

    4 5
    1 2 3 4 5
    5 4 9 8 7
    6 5 3 4 1
    9 8 4 5 3

    问题补充:其中,4 5 表示这个数组的行、列数,下面才是这个数组的内容,它们在一个.dat文件中,要求用C语言读入,

    #include<stdio.h>
    main()
    {FILE *fp;
    int i,j,arr[4][5];
    if((fp=fopen("arr.dat","rb"))==NULL)   
    printf("Read error!!");
    for(i=0;i<4;i++)
    fread(a[i],5*sizeof(int),1,fp);   
    
    puts("The arrange is");
    for(i=0;i<4;i++)
    {for(j=0;j<5;j++)
      printf("%d\t",a[i][j]);
      putchar('\n');
    }
    
    /////////////////////////////////////////////////////////////////////////////////////
    将一到九的阶乘各值存入data.dat文件,要求在文件中每个值占一行,以左对齐方式存储
    #include <stdio.h> main() { int i,j,a; FILE*fp; fp=fopen("data.dat","w"); for(i=1;i<=9;i++) { for(a=1,j=1;j<=i;j++)a*=j; fprintf(fp,"%d\n",a); } fclose(fp); } 
    /////////////////////////////////////////////////////////////////////////////////

    把vc的变量保存成mat文件格式

    学习 2007-03-27 17:53:29 阅读287 评论0   字号: 订阅
    在公司忙活,写得一个简单的库。把vc的变量保存成mat文件格式,方便使用
    matlab处理数据。
    
    //头文件matdata.h
    #ifndef _MATDATA
    #define _MATDATA
    
    #define Dll_IMPORT   __declspec( dllimport )
    #define Dll_EXPORT   __declspec( dllexport )
    
    #define DATA_TYPE_STRING    0x4024
    
    #define DATA_TYPE_UCHAR     0x6012
    #define DATA_TYPE_USHORT    0x6023
    #define DATA_TYPE_SHORT     0x6024
    #define DATA_TYPE_INT       0x6045
    #define DATA_TYPE_DOUBLE    0x6089 
         
    
    
    Dll_EXPORT void sdatamatfile(char* filename, char*varbname, void* pdata, int 
    type, int row, int col);
    Dll_EXPORT void creatematfile(char* filename);
    Dll_EXPORT void adatamatfile(char* filename, char*varbname, void* pdata, 
    int type, int row, int col);
    
    void writefhead(FILE* fp);
    void writefdata(FILE* fp, char* varbname, void* pdata, int type, int row, 
    int col);
    
    #endif
    
    
    //cpp文件:matdata.cpp
    #include "stdafx.h"
    #include "stdlib.h"
    #include "stdio.h"
    #include <time.h>
    
    #include "matdata.h"
    
    char mat_data_fhead1[51] {"MATLAB 5.0 MAT-file, Platform: PCWIN, Created 
    on: "};
    char mat_data_fhead2[51] 
    {"                                                  "}; 
    char mat_data_fhead3[4] {0, 0x01, 0x49, 0x4d};
    
    char mat_data_dhead[32]  
    {0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x00,0x00,0
    x00,
            
    0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x
    00};
    
    void writefhead(FILE* fp)
    {
        char* datetime NULL;
        time_t ltime;
        tm* today;
    
        time(&ltime);
        today localtime(&ltime);
        datetime asctime(today);
    
        fwrite(mat_data_fhead1, 1, 50, fp);
        fwrite(datetime, 1, 24, fp);
        fwrite(mat_data_fhead2, 1, 50, fp);
        fwrite(mat_data_fhead3, 1, 4, fp);
    }
    
    void writefdata(FILE* fp, char*varbname, void* pdata, int type, int row, 
    int col)
    {
        unsigned long varbsize;     //变量以及补0占用的文件总大小,单位为字节
        unsigned long datasize;     //变量数据以及补0占用的文件大小,单位为字节
        unsigned long uintsize;     //数据单元的大小,单位为字节
        unsigned long namesize;     //变量名称以及补0占用的文件大小,单位为字节
        unsigned long datalen;      //变量数据的占用的空间,等于row和col和uintsiz
    e的乘积,单位为字节
        unsigned long namelen;      //变量名称字符串中的字符数目,单位为字节。
        unsigned long temp;         //用于保存中间变量
        unsigned int i;             //用于循环计数
        unsigned int datasort;      //数据种类:数值或字符串
    
        char c;
    
        //计算数据单元大小
        uintsize 0;
        uintsize type&0x00f0;
        uintsize uintsize>>4;
        datasort type&0xf000;
        datasort datasort>>12;
        type type&0x000f;
        
        //计算变量数据占用空间,为8的倍数。
        datalen uintsize*row*col;
        //如果数据占用空间小于4个字节,则表示数据大小的数据和数据共占用8个字节
        //数据占用4个字节,否则表示大小的数据占用8字节,数据另外
        //分配空间,不足8字节的部分补0
        if(datalen<=4)
        {
            datasize 4;
        }
        else
        {
            temp datalen%8;
            if(temp>0)temp 8-temp;
            datasize datalen temp;
        }
        //计算变量名称占用空间,为8的倍数。
        namelen strlen(varbname);
        //如果变量名小于4,则表示变量大小的数据和变量名共占用8个字节
        //变量名占用4个字节,否则表示大小的数据占用8字节,变量名另外
        //分配空间,不足8字节的部分补0
        if(namelen <= 4)
        {
            namesize 4;
        }
        else
        {
            temp namelen%8;
            if(temp>0)temp 8-temp;
            namesize namelen+temp;
        }
    
        //计算变量占用总空间。
        varbsize 24+8;
        if(namelen <= 4)
        {
            varbsize += 8;
        }
        else
        {
            varbsize varbsize namesize;
        }
        if(datalen <= 4)
        {
            varbsize += 8;
        }
        else
        {
            varbsize varbsize datasize;
        }
        //修改数据头
        unsigned long* pl;
        pl (unsigned long*)(&mat_data_dhead[4]);
        *pl varbsize;
        pl (unsigned long*)(&mat_data_dhead[16]);
        *pl datasort;
    
        //写入变量头
        fwrite(mat_data_dhead, 1, 32, fp);
        //写入行数列数
        unsigned long rowcol[2];
        rowcol[0] row;
        rowcol[1] col;
        fwrite(rowcol, 4, 2, fp);
        //写入变量名行数列数
        namelen strlen(varbname);
        if(namelen <= 4)
        {
            unsigned short namerowcol[2];
            namerowcol[0] 1; 
            namerowcol[1] (unsigned short)namelen;
            fwrite(&namerowcol, 2, 2, fp);
        }
        else
        {
            unsigned long namerowcol[2];
            namerowcol[0] 1; 
            namerowcol[1] namelen;
            fwrite(&namerowcol, 4, 2, fp);
        }
    
        //写入变量名
        namelen strlen(varbname);
        fwrite(varbname, 1, namelen, fp);
    
        c=0;
        for(i=0; i<namesize-namelen; i++)
        {
            fwrite(&c, 1, 1, fp);
        }
        //写入变量类型和占用空间
        if(datalen <= 4)
        {
            unsigned short stype, sdatalen;
            stype (unsigned short)type;
            sdatalen (unsigned short)datalen;
            fwrite(&stype, 2, 1, fp);
            fwrite(&sdatalen, 2, 1, fp);
        }
        else
        {
            fwrite(&type, 4, 1, fp);
            fwrite(&datalen, 4, 1, fp);
        }
    
        //写入数据
        char* pd;
        pd (char*)pdata;
        for(i 0; datasize; i++)
        {
            if(i<datalen)
            {
                fwrite(&pd[i], 1, 1, fp);
            }
            else
            {
                0;
                fwrite(&c, 1, 1, fp);
            }
        }
    }
    
    Dll_EXPORT void sdatamatfile(char* filename, char*varbname, void* pdata, 
    int type, int row, int col)
    {
        FILE* fp=NULL;
        fp fopen(filename, "wb");
        writefhead(fp);
        writefdata(fp, varbname, pdata, type, row, col);
        fclose(fp);
    }
    
    Dll_EXPORT void creatematfile(char* filename)
    {
        FILE* fp=NULL;
        fp fopen(filename, "wb");
        if(fp!=NULL)
        {
            writefhead(fp);
        }
        fclose(fp);
    }
    
    Dll_EXPORT void adatamatfile(char* filename, char*varbname, void* pdata, 
    int type, int row, int col)
    {
        FILE* fp=NULL;
        fp fopen(filename, "a+b");
        if(fp!=NULL)
        {
            writefdata(fp, varbname, pdata, type, row, col);
        }
        fclose(fp);
    }

    ////////////////////////////////////////////////////////////////////////

    我有一个文本文件。格式如下 1 2 4.3 6.3 2.0 2.9 1.33 9.66 ... 两列之间是空格 如何把每列数组读出来然后赋值给不同的数组? 如第一列数值赋值给a,第一列数值赋值给b
    关于读数,这样更标准一些,尤其是文件名不是纯英文的时候 x=load('filename'); a=x(:,1); b=x(:,2); "数列中只有大于3的数才会被读入" I=find(a>3); %I记录的是所有大于3的数的下标 b=a(I);
    ///////////////////////////////////////////////////////////////////
    我的处理方法是:
    先把Ccs中的数组通过fopen fprintf fclose 三个函数保存到一个.txt文件中。
    然后再matlab中用load读入.txt,以A=load('文件名.txt')形式,构成一个一维的数组A;
    最后按一定规则把A付给另一个二维数组B,或三维数组C的对应元素上。
    B或者C就是我们所需要的.mat格式的多维数组了。
     
    或者按照武曜的处理办法:
    用C直接把数组按照matlab中.mat文件的格式保存;
    把保存的文件命名为.mat;
    这样matlab就能直接用了。但是这需要了解.mat文件的具体格式。难呢?
    (上面找到了示例程序)

  • 相关阅读:
    Linux系列教程(二十)——Linux的shell概述以及如何执行脚本
    Linux系列教程(十九)——Linux文件系统管理之手工分区
    Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令
    Linux系列教程(十七)——Linux权限管理之文件系统系统属性chattr权限和sudo命令
    Linux系列教程(十六)——Linux权限管理之ACL权限
    Linux系列教程(十五)——Linux用户和用户组管理之用户管理命令
    flask-sqlalchemy用法详解
    flask 扩展包
    机器学习的数学基础-(三、概率论和数理统计)
    机器学习的数学基础-(二、线性代数)
  • 原文地址:https://www.cnblogs.com/youngforever/p/3104735.html
Copyright © 2020-2023  润新知