我有一个复数的文本文件,格式如下所示,
(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)') 返回一个空数组。
请为上述建议正确的单行实施。
答案 0 :(得分:2)
这可能不是最快的方法,但很简单:
importdata
读取文件。结果是一个字符串的单元格数组,每个字符串对应一个文件行。regexp
提取每行中的数字。结果是单元阵列的单元阵列。第一级对应于行,第二级对应于每行中检测到的数字。str2double
转换为数字数组。代码:
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