MATLAB读取CCS保存的数据

时间:2022-10-29 21:31:43

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