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