开始Matlab和编程学习之路,冲!
提醒大家,编程和Matlab早肝早受益,早淦早幸福!
1. 背景
我的方向是做运动康复生物力学相关,主要是通过生物力学数据来定量定性评估运动损伤、康复训练以及运动训练,涉及到数据有:关节力矩、肌电信号、足底压力值、肌张力等,最多用SPSS软件做做数理统计分析,按照步骤输入数据,简单操作即可。
随着采集大量数据,数据处理问题异常严峻,让我意识到数据处理方法和编程的重要性。
2. Matlab和编程的学习原则
作为编程小白,且天赋不足的选手,我觉得学习Matlab时方法很重要,总结一句话就是,
***首先一定要用起来,然后再逐步提高技巧。** *
3. 初期学习目标
大目标:以目标为导向,先用起来再精进;
小目标:
数据排序、求平均数和标准差;
数据归一化;
作图(设置主题,颜色,xy轴标题等);
4. 代码案例分享
以一段简单的代码为例,这段代码主要目的是求若干组数(x,y)的平均值,分享给大家(CSDN很多大神,本菜鸡就上菜了!),数据包分享在附件中哈~
%统计输入矩阵fd的每个角度的压力和,个数,均值?
function [meanfd,position_min,position_max,geshu] = meanForce(fd)
[x,y0] = size(fd); %求数据列数
y = y0/2; %列数/2即为position列数
position_min = 90;
position_max = 1;
for i=1:x %求最小角度和最大角度
for j=1:y
if (fd(i,2*j-1) <= position_min)
position_min = fd(i,2*j-1);
end
if (fd(i,2*j-1) >= position_max)
position_max = fd(i,2*j-1);
end
end
end
position = position_min:position_max;
geshu = length(position); %列数length
meanfd = [position;zeros(1,geshu);zeros(1,geshu);zeros(1,geshu)]';
%position,压力和,position个数,对应force均值
bucha = 1 - position_min;
%补差位,最小角度序号为1,则任一角度的序号=角度+1-最小角度
for i=1:x
for j=1:y
meanfd(fd(i,2*j-1)+bucha,2) = meanfd(fd(i,2*j-1)+bucha,2) + fd(i,2*j); %位置相同的数据,对应偶数列的压力进行叠加求和
meanfd(fd(i,2*j-1)+bucha,3) = meanfd(fd(i,2*j-1)+bucha,3) + 1;
%位置相同的数据,计算position总个数
end
end
for k=1:geshu
meanfd(k,4) = meanfd(k,2) / meanfd(k,3);
%对应每一个位置,均值=和/个数
end
clear all;
close all;
clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 获取数据列数
Film = '112502_CPM_Knee Extension - CPM.csv'; %文件名
fid = fopen(Film);
tline = fgetl(fid); %读第一行
Col = length(find(tline==','))+1; %列数 = 逗号个数 +1
fclose(fid);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 读文件,方法
fid = fopen(Film);
C = textscan(fid,'%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s','Delimiter',',');
fclose(fid);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 获取标志点坐标
for i=1:Col
D0(:,i) = strcmp(C{i},'Direction 0 : Rep by Rep'); %比对字符串
D1(:,i) = strcmp(C{i},'Direction 1 : Rep by Rep');
end
[colD0,rowD0] = find(D0'); %取得标志点坐标,不转置则按列数从大小到达排,转置按行数从小到大排
[colD1,rowD1] = find(D1');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 获取文件行数,区别原来行数
row_xin = find(strcmp(C{2},'mean')); %匹配字符串
if (isempty(row_xin)) %做判断
[Row,x] = size(D0); %如果文件中第二列没有mean,数据行数=文件行数
else
Row = row_xin(1)-1; %如果有mean,数据行数=第一个mean行数-1
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 按标志点坐标,分块读取数据
pfd0 = csvread(Film,rowD0(1)+2,colD0(1)-1,[rowD0(1)+2,colD0(1)-1,rowD0(2)-2,colD1(1)-2]);
pfd1 = csvread(Film,rowD1(1)+2,colD1(1)-1,[rowD1(1)+2,colD1(1)-1,rowD1(2)-2,Col-1]);
f1d0 = csvread(Film,rowD0(2)+2,colD0(2)-1,[rowD0(2)+2,colD0(2)-1,rowD0(3)-2,colD1(2)-2]);
f1d1 = csvread(Film,rowD1(2)+2,colD1(2)-1,[rowD1(2)+2,colD1(2)-1,rowD1(3)-2,Col-1]);
f2d0 = csvread(Film,rowD0(3)+2,colD0(3)-1,[rowD0(3)+2,colD0(3)-1,rowD0(4)-2,colD1(3)-2]);
f2d1 = csvread(Film,rowD1(3)+2,colD1(3)-1,[rowD1(3)+2,colD1(3)-1,rowD1(4)-2,Col-1]);
f3d0 = csvread(Film,rowD0(4)+2,colD0(4)-1,[rowD0(4)+2,colD0(4)-1,Row-1,colD1(4)-2]);
f3d1 = csvread(Film,rowD1(4)+2,colD1(4)-1,[rowD1(4)+2,colD1(4)-1,Row-1,Col-1]);
%%%%%%%%%%%%%%%%%%%%%%%%% 计算均值,拟合曲线,计算斜率,作图
pfd = {pfd0;pfd1;f1d0;f1d1;f2d0;f2d1;f3d0;f3d1};
biaoti = {'pfd0';'pfd1';'f1d0';'f1d1';'f2d0';'f2d1';'f3d0';'f3d1'};
meanpfd = {}; %均值数据元胞
position_min = zeros(1,8);
position_max = zeros(1,8);
geshu = zeros(1,8);
p = zeros(8,4); %拟合数据元胞,4是系数个数,列数????
yx = {}; %斜率数据元胞
for m=1:8
[meanpfd{m},position_min(m),position_max(m),geshu(m)] = meanForce(pfd{m}); %外部函数,计算均值,最小角度,最大角度,角度个数
p(m,:) = polyfit(meanpfd{m}(:,1),meanpfd{m}(:,4),3); %做3阶二项式拟合
x = linspace(position_min(m)-1,position_max(m)+1,10*(position_max(m)-position_min(m))+1);
y = polyval(p(m,:),x); %计算拟合曲线
for n=1:geshu(m) %计算斜率
yx{m}(n,1) = (polyval(p(m,:),meanpfd{m}(n,1)+0.1) - polyval(p(m,:),meanpfd{m}(n,1)-0.1))/0.2;
end
figure(1);
subplot(2,4,m); %以下作图
plot(meanpfd{m}(:,1),meanpfd{m}(:,4),'*',x,y);
axis([position_min(m),position_max(m),-inf,inf]);
title(biaoti{m});
xlabel('Position/ROM');
ylabel('Force');
figure(2);
subplot(2,4,m);
plot(yx{m});
axis([position_min(m),position_max(m),-inf,inf]);
title(biaoti{m});
xlabel('Position/ROM');
ylabel('Stiffness');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输出数据重整
shuju = zeros(max(geshu),24);
for m=1:8
for r=1:max(geshu)
if (r<=geshu(m))
shuju(r,(3*m-2):(3*m)) = [ meanpfd{m}(r,1),meanpfd{m}(r,4),yx{m}(r,1)];
else
shuju(r,(3*m-2):(3*m)) = [0,0,0];
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 写入数据
fid = fopen(Film,'a');
fprintf(fid,'\r\n \r\n pfd0,mean,stiffness, ,pfd1,mean,stiffness, ,f1d0,mean,stiffness, ,f1d1,mean,stiffness, ,f2d0,mean,stiffness, ,f2d1,mean,stiffness, ,f3d0,mean,stiffness, ,f3d1,mean,stiffness \r\n ');
fprintf(fid,'%d,%.1f,%.2f, ,%d,%.1f,%.2f, ,%d,%.1f,%.2f, ,%d,%.1f,%.2f, ,%d,%.1f,%.2f, ,%d,%.1f,%.2f, ,%d,%.1f,%.2f, ,%d,%.1f,%.2f \r\n ',shuju');
fclose(fid);
小伙伴如果觉得有用,可以帮忙点点关注和收藏鼓励一下么,么么哒!!