查看: 2418|回复: 5|关注: 0

[已答复] 方向统计 - 有更简洁的代码吗

[复制链接]

新手

5 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
发表于 2017-6-20 08:30:07 | 显示全部楼层 |阅读模式
  1. clear;clc;
  2. filename = 'Wave';
  3. range = 'E9:E333128';
  4. [raw_direction] = xlsread(filename,range);
  5. a = length(raw_direction);

  6. direction = {'N';'NNE';'NE';'ENE';'E';'ESE';'SE';'SSE';'S';'SSW';...
  7.     'SW';'WSW';'W';'WNW';'NW';'NNW'};
  8. switched_direction = [];
  9. for i = 1:a
  10.     if raw_direction(i)>=0&&raw_direction(i)<11.25
  11.         switched_direction = [switched_direction direction(1)];
  12.     elseif raw_direction(i)>=11.25&&raw_direction(i)<33.75
  13.         switched_direction = [switched_direction direction(2)];
  14.     elseif raw_direction(i)>=33.75&&raw_direction(i)<56.25
  15.         switched_direction = [switched_direction direction(3)];
  16.     elseif raw_direction(i)>=56.25&&raw_direction(i)<78.75
  17.         switched_direction = [switched_direction direction(4)];
  18.     elseif raw_direction(i)>=78.75&&raw_direction(i)<101.25
  19.         switched_direction = [switched_direction direction(5)];
  20.     elseif raw_direction(i)>=101.25&&raw_direction(i)<123.75
  21.         switched_direction = [switched_direction direction(6)];
  22.     elseif raw_direction(i)>=123.75&&raw_direction(i)<146.25
  23.         switched_direction = [switched_direction direction(7)];
  24.     elseif raw_direction(i)>=146.25&&raw_direction(i)<168.75
  25.         switched_direction = [switched_direction direction(8)];
  26.     elseif raw_direction(i)>=168.75&&raw_direction(i)<191.25
  27.         switched_direction = [switched_direction direction(9)];
  28.     elseif raw_direction(i)>=191.25&&raw_direction(i)<213.75
  29.         switched_direction = [switched_direction direction(10)];
  30.     elseif raw_direction(i)>=213.75&&raw_direction(i)<236.25
  31.         switched_direction = [switched_direction direction(11)];
  32.     elseif raw_direction(i)>=236.25&&raw_direction(i)<258.75
  33.         switched_direction = [switched_direction direction(12)];
  34.     elseif raw_direction(i)>=258.75&&raw_direction(i)<281.25
  35.         switched_direction = [switched_direction direction(13)];
  36.     elseif raw_direction(i)>=281.25&&raw_direction(i)<303.75
  37.         switched_direction = [switched_direction direction(14)];
  38.     elseif raw_direction(i)>=303.75&&raw_direction(i)<326.25
  39.         switched_direction = [switched_direction direction(15)];        
  40.     elseif raw_direction(i)>=326.25&&raw_direction(i)<348.75
  41.         switched_direction = [switched_direction direction(16)];
  42.     else
  43.         switched_direction = [switched_direction direction(1)];
  44.     end
  45. end

  46. fileID = fopen('celldata.dat','w');
  47. formatSpec = '%s\r\n';
  48. for ip = 1:a
  49.     fprintf(fileID,formatSpec,switched_direction{1,ip});
  50. end
  51. fclose(fileID);
复制代码
一个Wave有一个方向值(0度~360度),例如E向为(90度-11.25度,90度+11.25度)。现在将每个方向值转化为方向,这样的代码是不是太傻瓜了。有更好的方法吗?

回复主题 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

234 麦片

财富积分


50500


5

主题

269

帖子

52

最佳答案
  • 关注者: 6
发表于 2017-6-20 09:14:13 | 显示全部楼层
  1. ... % 导入数据
  2. raw_direction = raw_direction(:);
  3. direction = {'N';'NNE';'NE';'ENE';'E';'ESE';'SE';'SSE';'S';'SSW';...
  4.     'SW';'WSW';'W';'WNW';'NW';'NNW';'N'}; % 注意最后加了一个'N'
  5. ticks = (0:22.5:360) - 22.5/2;
  6. TFmat = raw_direction > ticks;
  7. k = sum(TFmat, 2);
  8. switched_direction = direction(k);
复制代码
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
 楼主| 发表于 2017-6-20 13:58:15 | 显示全部楼层
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

234 麦片

财富积分


50500


5

主题

269

帖子

52

最佳答案
  • 关注者: 6
发表于 2017-6-21 14:37:28 | 显示全部楼层

当然不是,只是你这个问题恰好容易解决。
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
 楼主| 发表于 2017-6-22 08:27:23 | 显示全部楼层
  1. raw_direction = [0 45 90 135 180 215 250 359];
  2. direction = {'N';'NNE';'NE';'ENE';'E';'ESE';'SE';'SSE';'S';'SSW';...
  3.    'SW';'WSW';'W';'WNW';'NW';'NNW';'N'}; % 注意最后加了一个'N'
  4. ticks = (0:22.5:360) - 22.5/2;
  5. TFmat = raw_direction > ticks;
  6. k = sum(TFmat, 2);
  7. switched_direction = direction(k);
复制代码


试了一下:
错误使用  >
矩阵维度必须一致。

出错 test (line 6)
TFmat = raw_direction > ticks;
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

234 麦片

财富积分


50500


5

主题

269

帖子

52

最佳答案
  • 关注者: 6
发表于 2017-6-22 15:32:30 | 显示全部楼层
dunhaotian 发表于 2017-6-22 08:27
试了一下:
错误使用  >
矩阵维度必须一致。

那就是旧版本不支持不同维度直接计算,把第五行换成:
TFmat = bsxfun(@gt, raw_direction, ticks);
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表