之前写过一个关于matlab绘制时间的文章(传送门:Matlab-绘制日期和持续时间图),正好有个同学问道这个问题,他是采集了手机的加速度数据进行处理,之前也有一个关于这个文章(传送门:Matlab从移动设备获取加速度数据对步数进行计数)
下图是他提供的代码报错问题
看代码报错提示,出现在18行,
看变量区对应的Acceleration,
接着看提取的XYZ,可以发现对应的XYZ是一个timetable类,如果要取真实对应的数据, 还需要写明对应类下面的列,也就是x.X y.Y z.Z才是获取到真实的数据
代码修改为:
代码语言:javascript复制mag = sqrt(sum(x.X.^2 y.Y.^2 z.Z.^2));
但是结果依旧报错,为啥呢???
查看mag变成了一个1x1的数据
原因:代码中的sum求和不对,
可修改为:
代码语言:javascript复制mag = sqrt(x.X.^2 y.Y.^2 z.Z.^2);
%% 或者
mag = sqrt(sum(x.X.^2 y.Y.^2 z.Z.^2,2));
最后绘制图像的时候又出现了一个问题
代码语言:javascript复制>> plot(t,mag);
数据输入必须与坐标轴配置匹配。数值坐标轴必须具有数值数据输入,或者具有
可转换为双精度值的数据输入。
提示我们t的变量类似不对
为啥呢:
仔细看代码会发现前面plot的时候有个hold on,也就是说明后面的plot也是接着前面的xlabel,前面的xlabel未定义为timetable,从而导致了这个报错,代码最终修改为:
代码语言:javascript复制load('test1.mat');
t = Acceleration.Timestamp;
x = Acceleration.X;
y = Acceleration.Y;
z = Acceleration.Z;
figure
plot(x,'b')
hold on;
plot(y,'r')
hold on;
plot(z,'g')
hold off;
legend('X','Y','Z');
xlabel('Relative time (s)');
ylabel('Acceleration (m/s^2)');
x = Acceleration(:,1);
y = Acceleration(:,2);
z = Acceleration(:,3);
mag = sqrt(x.X.^2 y.Y.^2 z.Z.^2);
figure
plot(t,mag);
完美运行,撒花完结