【问题标题】:Convert .csv to .out (complex numbers)将 .csv 转换为 .out(复数)
【发布时间】:2019-10-23 18:05:19
【问题描述】:

我有一个包含复数的 csv 文件。

这是我在 csv 文件中的一些数字示例:

(0.12825663763789857+0.20327998150393212j),(0.21890748607218197+0.160563964013564j),(0.28205414129281525+0.09884068776334366j),(0.030927026479380615+0.26334550583848626j)

我想读取这个文件,然后在 (.out) 文件中保存第一列中的所有实部和第二列中的所有虚部(没有虚字母 j)。

【问题讨论】:

  • 您可以使用readmatrix 读取文件,real 获取数字的实部,例如,writematrix 将实部写入文件。如果您遇到问题,请向我们展示您尝试过的方法和无效的方法。
  • @PatrickHappel 我的matlab版本(R2017b)中没有readmatrix函数
  • 对于 2019a 之前的版本,请使用 csvread
  • @PatrickHappel,我收到以下错误:................................. ............. 使用 dlmread 时出错(第 147 行)文件和格式字符向量之间不匹配。 Trouble reading 'Numeric' field from file (row number 1, field number 1) ==> (0.12825663763789857+0.20327998150393212j),(0.21890748607218197+0.160563964013564j),(0.28205414129281525+0.09884068776334366j),(0.030927026479380615+0.26334550583848626j),(- 0.04689936501211118+0.25553... csvread 错误(第 48 行) m=dlmread(filename, ',', r, c); graph_plot 错误(第 9 行) M = csvread('sol360.csv');
  • 您的 csv 文件中的数字是否都在一行中?

标签: matlab csv file-upload complex-numbers


【解决方案1】:

这是一次尝试。由于您的号码周围有(),所以它稍微复杂一些。

首先,使用textscan 读取文件。因为我猜你不知道文件中有多少个数字,所以将所有内容读入一个字符串。也适用于多行:

filename = 'data.csv';
fid = fopen(filename);
content = textscan(fid, '%s');
fclose(fid);

为此,content 现在是一个有点奇怪的cell 数组(有关详细信息,请查看textscan-docs)。只需初始化变量nums,它将存储数字并循环通过content(如果您对您的csv文件了解更多,您可以预先分配nums):

nums = []; 
for c1 = 1:numel(content{1})

接下来,在每次出现, 时拆分字符串:

    string_list = strsplit(content{1}{c1},',');

这给出了另一个元胞数组。循环遍历它以将字符串转换为数字(并结束外循环):

    for c2 = 1 : numel(string_list)
        nums(end+1) = str2num(string_list{c2});
    end
end

最后,将数字的实部和虚部分别存储在不同的列中:

out = [];
out(:,1) = real(nums);
out(:,2) = imag(nums);

并将其保存到data.out更新正如您提到的精度,您可以使用

dlmwrite('data.out', out, 'precision','%.20f');

不过,这里需要了解 Matlab 中的floating point representation。尤其要尝试理解以下内容:

>> a = 0.12825663763789857

a =

    0.1283

>> fprintf('%.20f\n', a)
0.12825663763789857397
>> eps(a)

ans =

   2.7756e-17

请注意,可以在不将字符串转换为数字的情况下完成此操作,但上述方式将允许您在 Matlab 中使用数据,而不仅仅是保存它。

【讨论】:

  • 哇,非常感谢!我会尝试在我的代码中读取这个文件,看看是否一切正常。再次感谢!
  • 谢谢,它工作得很好,但我只想知道如何保存复数的完整数字而不是短格式?
  • 我想这已经解决了,dlmwrite('data_new.out', out, 'precision', '%i')...但是如果我想写完整的岁差怎么办?
  • 我已经编辑了我的答案并发布了第二个答案,它不会将字符串转换为数字。
  • 既然您是新用户,请允许我注意以下几点:如果您发现其中一个答案有用,请考虑accepting it
【解决方案2】:

这是一种不将字符串转换为数字的尝试,因此不必处理精度问题。它也适用于负实数和虚数。 + 符号在写入新文件时被删除,- 符号被保留:

filename = 'data.csv';
fid = fopen(filename);
content = textscan(fid, '%s');
fclose(fid);
fid = fopen('data.out','w');
pattern = '(?<real>-{0,1}\d+.\d+)(?<imag>[+-]\d+.\d+)j';
for c1 = 1:numel(content{1})
    result = regexp(content{1}{c1}, pattern, 'names');
    for c2 = 1:numel(result)
        fprintf(fid, '%s,%s\n', strrep(result(c2).real,'+',''), strrep(result(c2).imag,'+',''));
    end
end
fclose(fid);

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2011-04-25
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多