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文件的具体格式。难呢?
(上面找到了示例程序)

原文地址:https://www.cnblogs.com/youngforever/p/3104735.html