[已解决] Matlab怎样从txt文件中提取点的坐标并构成矩阵?

[复制链接]
lh899 发表于 2018-5-26 18:51:58
本帖最后由 lh899 于 2018-5-26 18:55 编辑

本人刚接触Matlab,恳请各位大侠指导一二!是这样的,我实验测得的点的三维坐标在txt文件中,我想用点的坐标画三维曲线图,而文本中vertex后的每个点的三维坐标是画图需要的,其余的都想删除掉,而且在每个点的三维坐标后面加上分号构成坐标矩阵,这样方便用surf画图。数据点大约有30多万个,Matlab可以实现吗?下面是部分数据,数据格式每七行一个循环,红色标记的就是需要的点的三维坐标。
需要处理的txt文件:
facet normal 0.170690 0.736314 0.654757
outer loop
   vertex -705.110657 655.001160 -148.383484
   vertex -705.284058 659.211365 -153.072876
   vertex -707.940552 655.501038 -148.207916
endloop
endfacet
facet normal 0.128912 0.740261 0.659845
outer loop
   vertex -705.110657 655.001160 -148.383484
   vertex -702.244812 654.432129 -148.305023
   vertex -705.284058 659.211365 -153.072876
endloop
endfacet
facet normal 0.018912 0.782632 0.622197
outer loop
   vertex -707.623718 651.086243 -142.664383
   vertex -707.940552 655.501038 -148.207916
   vertex -710.597778 651.880493 -143.573013
endloop
endfacet
希望得到的文本:
-705.110657 655.001160 -148.383484;
-705.284058 659.211365 -153.072876;
-707.940552 655.501038 -148.207916;
-705.110657 655.001160 -148.383484;
-702.244812 654.432129 -148.305023;

-705.284058 659.211365 -153.072876
-707.623718 651.086243 -142.664383;
-707.940552 655.501038 -148.207916;
-710.597778 651.880493 -143.573013;

最佳答案


悟得 发表于 2018-5-26 21:59:11
我用了一组数存到了一个txt里
facet normal 0.018912 0.782632 0.622197
outer loop
   vertex -707.623718 651.086243 -142.664383
   vertex -707.940552 655.501038 -148.207916
   vertex -710.597778 651.880493 -143.573013
endloop
endfacet
这个函数可以读到中间九个数字,并放到一个矩阵里

  1. function Untitled = importfile(filename, startRow, endRow)
  2. %IMPORTFILE Import numeric data from a text file as a matrix.
  3. %   UNTITLED = IMPORTFILE(FILENAME) Reads data from text file FILENAME for
  4. %   the default selection.
  5. %
  6. %   UNTITLED = IMPORTFILE(FILENAME, STARTROW, ENDROW) Reads data from rows
  7. %   STARTROW through ENDROW of text file FILENAME.
  8. %
  9. % Example:
  10. %   Untitled = importfile('新建文本文档 (2).txt', 3, 5);
  11. %
  12. %    See also TEXTSCAN.

  13. % Auto-generated by MATLAB on 2018/05/26 21:59:35

  14. %% Initialize variables.
  15. delimiter = ' ';
  16. if nargin<=2
  17.     startRow = 3;
  18.     endRow = 5;
  19. end

  20. %% Format for each line of text:
  21. %   column2: double (%f)
  22. %        column3: double (%f)
  23. %   column4: double (%f)
  24. % For more information, see the TEXTSCAN documentation.
  25. formatSpec = '%*s%f%f%f%*s%[^\n\r]';

  26. %% Open the text file.
  27. fileID = fopen(filename,'r');

  28. %% Read columns of data according to the format.
  29. % This call is based on the structure of the file used to generate this
  30. % code. If an error occurs for a different file, try regenerating the code
  31. % from the Import Tool.
  32. dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
  33. for block=2:length(startRow)
  34.     frewind(fileID);
  35.     dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
  36.     for col=1:length(dataArray)
  37.         dataArray{col} = [dataArray{col};dataArrayBlock{col}];
  38.     end
  39. end

  40. %% Close the text file.
  41. fclose(fileID);

  42. %% Post processing for unimportable data.
  43. % No unimportable data rules were applied during the import, so no post
  44. % processing code is included. To generate code which works for
  45. % unimportable data, select unimportable cells in a file and regenerate the
  46. % script.

  47. %% Create output variable
  48. Untitled = [dataArray{1:end-1}];
复制代码

11 条回复


悟得 发表于 2018-5-26 19:09:10
点matlab工具栏上的import data。
然后选中你要的数据。可以直接导入。
也可以生成脚本或者函数。

lh899 发表于 2018-5-26 19:44:25
悟得 发表于 2018-5-26 19:09
点matlab工具栏上的import data。
然后选中你要的数据。可以直接导入。
也可以生成脚本或者函数。 ...

感谢回答,但是我的数据中需要的和不需要的掺杂在一起,而且有三十万个数据,挨个选择不太现实,所以有什么办法可以将不需要的内容删去吗?

lh899 发表于 2018-5-26 19:48:26
本帖最后由 lh899 于 2018-5-26 19:50 编辑


lh899 发表于 2018-5-26 19:51:19
悟得 发表于 2018-5-26 19:09
点matlab工具栏上的import data。
然后选中你要的数据。可以直接导入。
也可以生成脚本或者函数。 ...

我知道大侠的意思了,我试一下

悟得 发表于 2018-5-26 20:26:44
lh899 发表于 2018-5-26 19:51
我知道大侠的意思了,我试一下

生成函数之后,你可以循环读的。选一个文件就行了。只要你所有文件的格式都是这个样子。

lh899 发表于 2018-5-26 21:26:36
悟得 发表于 2018-5-26 20:26
生成函数之后,你可以循环读的。选一个文件就行了。只要你所有文件的格式都是这个样子。 ...

大侠我还是没搞懂导入函数该怎么用,大侠可以用上面我发的部分数据做个示范吗?

悟得 发表于 2018-5-26 21:59:11
我用了一组数存到了一个txt里
facet normal 0.018912 0.782632 0.622197
outer loop
   vertex -707.623718 651.086243 -142.664383
   vertex -707.940552 655.501038 -148.207916
   vertex -710.597778 651.880493 -143.573013
endloop
endfacet
这个函数可以读到中间九个数字,并放到一个矩阵里

  1. function Untitled = importfile(filename, startRow, endRow)
  2. %IMPORTFILE Import numeric data from a text file as a matrix.
  3. %   UNTITLED = IMPORTFILE(FILENAME) Reads data from text file FILENAME for
  4. %   the default selection.
  5. %
  6. %   UNTITLED = IMPORTFILE(FILENAME, STARTROW, ENDROW) Reads data from rows
  7. %   STARTROW through ENDROW of text file FILENAME.
  8. %
  9. % Example:
  10. %   Untitled = importfile('新建文本文档 (2).txt', 3, 5);
  11. %
  12. %    See also TEXTSCAN.

  13. % Auto-generated by MATLAB on 2018/05/26 21:59:35

  14. %% Initialize variables.
  15. delimiter = ' ';
  16. if nargin<=2
  17.     startRow = 3;
  18.     endRow = 5;
  19. end

  20. %% Format for each line of text:
  21. %   column2: double (%f)
  22. %        column3: double (%f)
  23. %   column4: double (%f)
  24. % For more information, see the TEXTSCAN documentation.
  25. formatSpec = '%*s%f%f%f%*s%[^\n\r]';

  26. %% Open the text file.
  27. fileID = fopen(filename,'r');

  28. %% Read columns of data according to the format.
  29. % This call is based on the structure of the file used to generate this
  30. % code. If an error occurs for a different file, try regenerating the code
  31. % from the Import Tool.
  32. dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
  33. for block=2:length(startRow)
  34.     frewind(fileID);
  35.     dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
  36.     for col=1:length(dataArray)
  37.         dataArray{col} = [dataArray{col};dataArrayBlock{col}];
  38.     end
  39. end

  40. %% Close the text file.
  41. fclose(fileID);

  42. %% Post processing for unimportable data.
  43. % No unimportable data rules were applied during the import, so no post
  44. % processing code is included. To generate code which works for
  45. % unimportable data, select unimportable cells in a file and regenerate the
  46. % script.

  47. %% Create output variable
  48. Untitled = [dataArray{1:end-1}];
复制代码
回复此楼

lh899 发表于 2018-5-28 22:16:53
大侠辛苦了,不好意思我刚刚看到,您这才是正确的做法。我按照您第一次的建议用导入数据的方法找到了一个只适用我这个类型的数据的比较讨巧的方法。我把过程截屏了上传图片了,图中能导入的蓝色区域正好是我需要的。导入数据后是一个多维的结构体,然后经过赋值得到了矩阵。但是确实很侥幸,因为换个数据类型估计就行不通了。我一定会好好学习Matlab的编程规则,再次感谢!

截屏

截屏

lh899 发表于 2018-5-28 22:18:53
悟得 发表于 2018-5-26 21:59
我用了一组数存到了一个txt里
facet normal 0.018912 0.782632 0.622197
outer loop

大侠辛苦了,不好意思我刚刚看到,您这才是正确的做法。我按照您第一次的建议用导入数据的方法找到了一个只适用我这个类型的数据的比较讨巧的方法。我把过程截屏了上传图片了,图中能导入的蓝色区域正好是我需要的。导入数据后是一个多维的结构体,然后经过赋值得到了矩阵。但是确实很侥幸,因为换个数据类型估计就行不通了。我一定会好好学习Matlab的编程规则,再次感谢!

Zyaxin111 发表于 2022-11-24 14:20:13
lh899 发表于 2018-5-28 22:18
大侠辛苦了,不好意思我刚刚看到,您这才是正确的做法。我按照您第一次的建议用导入数据的方法找到了一个 ...

您好,大佬,您这个是txt文件中随机点的坐标数据导入到MATLAB中存在矩阵中是怎么实现的呢,能够帮我解答一下嘛,我现在也是需要将二维数据点的坐标导入到MATLAB存为矩阵形式。期待您的回答

Zyaxin111 发表于 2022-11-24 14:22:49
悟得 发表于 2018-5-26 21:59
我用了一组数存到了一个txt里
facet normal 0.018912 0.782632 0.622197
outer loop

您好,大佬,请问一下我想把一些txt文件中随机的平面坐标点数据导入到MATLAB中存为矩阵形式,应该怎么搞呢,期待您的回答
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表