Конвертировать .csv в .out (комплексные числа) - PullRequest
0 голосов
/ 23 октября 2019

У меня есть CSV-файл с комплексными числами.

Это пример некоторых чисел, которые у меня есть в CSV-файле:

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

Я хочу прочитать этот файл и затем сохранитьв (.out) файл все действительные части в первом столбце и все мнимые части во втором столбце (без мнимой буквы j).

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Вот попытка без преобразования ваших строк в числа, поэтому не нужно иметь дело с точностью. Он работает и с отрицательными действительными и мнимыми числами. + знаки удаляются при записи в новый файл, - знаки сохраняются:

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);
0 голосов
/ 23 октября 2019

Вот одна попытка. Это немного сложнее из-за ( и ), которые окружают ваши цифры.

Во-первых, используйте textcan , чтобы прочитать файл. Поскольку, я думаю, вы не знаете, сколько чисел в файле, прочитайте все в одну строку. Также будет работать с несколькими строками:

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

Для этой цели content теперь немного странный массив cell (подробности смотрите в документах textscan). Просто инициализируйте переменную 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. В частности, постарайтесь понять следующее:

>> a = 0.12825663763789857

a =

    0.1283

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

ans =

   2.7756e-17

Обратите внимание, что можно было бы сделать это без центрирования строк в числа, но способ, описанный выше, позволит вам использовать данные в Matlab вместо простого их сохранения. .

...