将逗号分隔格式的复数从文本文件读取到MATLAB变量中

时间:2015-08-31 18:59:35

标签: matlab

我有一个复数的文本文件,格式如下所示,

(1.00000000,-0.00000000)
(0.66914010,0.74313629)
(-0.10450304,0.99452454)
(-0.80899447,0.58781630)
(-0.97815824,-0.20786168)
(-0.49997231,-0.86604136)
(0.30903524,-0.95105058)
(0.91354805,-0.40673080)
(0.91354805,0.40673080)
(0.30894405,0.95108020)

fscanf(fileID,'%f') 分别读取备用实际和复杂部分,但最终大小不匹配。例如,我的文件包含10,000个复数,因此我们希望扫描语句的输出返回20,000个值,但我得到47,104个值。

fscanf(fileID,'(%f,%f)') 返回一个空数组。

请为上述建议正确的单行实施。

2 个答案:

答案 0 :(得分:2)

这可能不是最快的方法,但很简单:

  1. 使用importdata读取文件。结果是一个字符串的单元格数组,每个字符串对应一个文件行。
  2. 使用regexp提取每行中的数字。结果是单元阵列的单元阵列。第一级对应于行,第二级对应于每行中检测到的数字。
  3. 删除一级单元格嵌套以获取字符串的单元格数组(每个字符串代表一个数字)并应用str2double转换为数字数组。
  4. 重塑成一个两行数组并将其解释为真实的虚部。
  5. 代码:

    x = importdata('file.txt');                     %// step 1
    x = regexp(x, '-?\d+.?\d*', 'match');           %// step 2
    x = str2double([x{:}]);                         %// step 3
    result = [1 1j]*reshape(x, 2, []);              %// step 4
    

    在您的示例中,结果(为清晰起见而转置)是

    >> result.'
    ans =
      1.000000000000000                     
      0.669140100000000 + 0.743136290000000i
     -0.104503040000000 + 0.994524540000000i
     -0.808994470000000 + 0.587816300000000i
     -0.978158240000000 - 0.207861680000000i
     -0.499972310000000 - 0.866041360000000i
      0.309035240000000 - 0.951050580000000i
      0.913548050000000 - 0.406730800000000i
      0.913548050000000 + 0.406730800000000i
      0.308944050000000 + 0.951080200000000i
    

答案 1 :(得分:2)

另一种方法是使用textscan

fid = fopen('file.txt');
out = textscan(fid, '(%f,%f)\n');
result = [out{1} + i*out{2}];
fclose(fid);

确保将file.txt更改为您的文本文件命名为的任何内容。但是,如果您使用的是Windows(感谢Luis Mendo!),则需要将\n分隔符更改为\r以表示回车符而不是换行符:

fid = fopen('file.txt');
out = textscan(fid, '(%f,%f)\r'); %// Change
result = [out{1} + i*out{2}];
fclose(fid);

首先使用fopen打开文件,然后将实部和虚部读取为两个单独的单元格数组。 (%f,%f)格式化字符串在一对()大括号中查找两个数字,并用逗号分隔它们。 \n(或\r如果您使用的是Windows)确保我们每行只查找一个此类模式。

一旦你这样做,我们解包第一个单元格并将其与解压缩的第二个单元格相加并乘以i,因为它是复杂的部分。结果将是一组复数值。确保在完成后关闭文件,并使用fclose完成。

我得到以下内容:

>> format long g;
>> result

result =

                          1 +                     0i
                  0.6691401 +            0.74313629i
                -0.10450304 +            0.99452454i
                -0.80899447 +             0.5878163i
                -0.97815824 -            0.20786168i
                -0.49997231 -            0.86604136i
                 0.30903524 -            0.95105058i
                 0.91354805 -             0.4067308i
                 0.91354805 +             0.4067308i
                 0.30894405 +             0.9510802i