***开始Matlab和编程学习之路,冲!***

开始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);

小伙伴如果觉得有用,可以帮忙点点关注和收藏鼓励一下么,么么哒!!

已标记关键词 清除标记
相关推荐
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页