DSP

MATLAB读取CCS保存的数据

2019-07-13 17:42发布

转自: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 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 ",a[i][j]);   putchar(' '); } ///////////////////////////////////////////////////////////////////////////////////// 将一到九的阶乘各值存入data.dat文件,要求在文件中每个值占一行,以左对齐方式存储 #include 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 ",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  #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(<ime);     today = localtime(<ime);     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 + 8 + namesize;     }     if(datalen <= 4)     {         varbsize += 8;     }     else     {         varbsize = varbsize + 8 + 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     {         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; i < datasize; i++)     {         if(i         {             fwrite(&pd[i], 1, 1, fp);         }         else         {             c = 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文件的具体格式。难呢? (上面找到了示例程序)