转自: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文件是由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
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_IMP ORT __declspec( dllimp ort )
#define Dll_EXPORT __declspec( dllexport )
#define DA TA_TYPE_STRING 0x4024
#define DA TA_TYPE_UCHAR 0x6012
#define DA TA_TYPE_USHORT 0x6023
#define DA TA_TYPE_SHORT 0x6024
#define DA TA_TYPE_INT 0x6045
#define DA TA_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_da ta_fhead1[51] = {"MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: "};
char mat_da ta_fhead2[51] = {" "};
char mat_da ta_fhead3[4] = {0, 0x01, 0x49, 0x4d};
char mat_da ta_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_da ta_fhead1, 1, 50, fp);
fwrite(datetime, 1, 24, fp);
fwrite(mat_da ta_fhead2, 1, 50, fp);
fwrite(mat_da ta_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_da ta_dhead[4]);
*pl = varbsize;
pl = (unsigned long*)(&mat_da ta_dhead[16]);
*pl = datasort;
//写入变量头
fwrite(mat_da ta_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文件的具体格式。难呢?
(上面找到了示例程序)