【问题标题】:Reading whitespace and linespace delimited complex numbers from a text file in MATLAB从 MATLAB 中的文本文件中读取空格和行空间分隔的复数
【发布时间】:2016-01-27 23:55:25
【问题描述】:

我在text file 的四列中有四个复数流

我必须以相同的格式将它们读入 MATLAB 矩阵。

我尝试了以下方法,但它不起作用

fid =  fopen('~/<path-to-file>/<fileName>.txt','r');
out = textscan(fid, '(%f,%f) \b\t(%f,%f) \b\t(%f,%f) \b\t(%f,%f) \n','CollectOutput',1);
tapWeights = [out{1} + 1i*out{2} out{3} + 1i*out{4} out{5} + 1i*out{6} out{7} + 1i*out{8}];
fclose(fid);

请注意,textscan 的帮助选项将\b\t 列为空白分隔符。

以下是我得到的输出,

>> out

out = 

    [1x8 double]

>> out{1}

ans =

     1     0   NaN   NaN   NaN   NaN   NaN   NaN

我在这里错过了什么?

【问题讨论】:

  • 试试dlmread - 你可以设置你想使用的分隔符。
  • 您甚至不需要在格式字符串中指定空格——textscan(fid, '(%f,%f) (%f,%f) (%f,%f) ') 就足够了。您也可以考虑使用'CollectOutput' 选项。
  • 感谢您的指出。额外的 (%f,%f) 是一个错字,但这不是问题。您能详细说明“收集输出”吗?工作代码的完整答案将非常有帮助。
  • FWIW,我尝试了@horchler 的解决方案,如果输入文本文件的格式与指定的格式完全相同,它就可以工作。它在问题中的输入方式,所有数字都在一行中,这与您的描述不同。也许这就是它不起作用的原因?
  • @AndrasDeak:我不确定你在说什么。该文件中唯一的内容是双精度数,然后在将它们加载到 Matlab 中后将它们组合成复数值。如果您指的是 textscan 之后的行,那似乎是有效的 Matlab 代码,但为了清楚起见,我会删除 + 周围的空格。

标签: matlab textscan


【解决方案1】:

除非我遗漏了什么,否则简单的regexpstr2doublecellfunreshape 就可以解决问题(假设矩阵的结构是已知的以便重塑它。

s='(1.00000000,0.00000000) (1.00000000,0.00000000) (-0.00000004,1.00000000) (-0.00000004,-1.00000000) (0.66912299,0.74315202) (0.66912299,0.74315202) (-0.74315202,0.66912293) (0.74315202,-0.66912305) (-0.10454900,0.99452001) (-0.10454900,0.99452001) (-0.99452001,-0.10454904) (0.99452001,0.10454895) (-0.80903500,0.58776098) (-0.80903500,0.58776098) (-0.58776093,-0.80903500) (0.58776104,0.80903500) (-0.97813898,-0.20795099) (-0.97813898,-0.20795099) (0.20795104,-0.97813898) (-0.20795095,0.97813898) (-0.49995700,-0.86605000) (-0.49995700,-0.86605000) (0.86605000,-0.49995697) (-0.86605000,0.49995703) (0.30907401,-0.95103800) (0.30907401,-0.95103800) (0.95103800,0.30907404) (-0.95103800,-0.30907398) (0.91357303,-0.40667400) (0.91357303,-0.40667400) (0.40667397,0.91357303) (-0.40667403,-0.91357303) (0.30893400,0.95108300)';
a=reshape(cellfun(@(x) str2double(x{1})+str2double(x{2})*1j,regexp(s,'[(]([^,]*),([^)]*)[)]','tokens')),3,[])'

【讨论】:

  • 是的,你错过了一些重要的东西——正如 OP 在问题中所说的数据来自文本文件,而不是通用字符串。此外,regexptextscan 慢得多,str2doublestr2num 更好(参见文档)。
  • @horchler。你对 str2double 的看法是对的,纠正了这一点。正则表达式可能会慢一些,但我更喜欢它,因为它的灵活性只要性能无关紧要。
  • “一个简单的 @987654334 @, @ @987654335 @, @987654336 @和 @987654337 @do trick`”
  • 除非我的眼睛在愚弄我,否则(至少对我而言)那串命令并不被认为是“简单的”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多