2015-08-31 3 views
1

У меня есть текстовый файл с комплексными числами в формате, показанном ниже,Чтение комплексных чисел в разделенных запятыми формат из текстового файла в переменную 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, «% е») читает в альтернативной реальной и сложной части отдельно, но конечный размер не совпадает. Например, мой файл содержит 10 000 комплексных чисел, поэтому мы ожидаем, что вывод инструкции сканирования вернет 20 000 значений, но вместо этого я получаю 47,104 значений.

fscanf (FILEID '(% е,% е)') возвращает пустой массив.

Пожалуйста, предложите правильную реализацию одной строки для вышеуказанного.

+0

Я откатить изменения. Вы должны обязательно уйти в свои попытки, потому что они показывают людям, что вы пробовали. Не делать этого может заставлять людей сбрасывать ваш вопрос, потому что им не очевидно, что вы что-то пробовали. Надеюсь, вы согласитесь! – rayryeng

+0

Я удалил контакт после блочных цитат, потому что он совершенно неактуальен. Материал о некорректном количестве значений заключается в том, что я читал неправильный файл. – Naveen

+0

А я вижу. Хорошо, все зависит от того, хотите ли вы сохранить мои изменения. В любом случае, я рад, что помог вам решить эту проблему! – rayryeng

ответ

2

Другой способ заключается в использовании textscan:

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

Марка обязательно измените file.txt, чтобы быть тем, что ваш текстовый файл называется. Однако, если вы используете ОС Windows (спасибо! Луис 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 
+1

Это намного проще! –

+1

Я нашел его. Мне нужно изменить '\ n' в' \ r'. Я нахожусь в Windows. Возможно, добавьте это в свой ответ? –

+0

@ LuisMendo - Ах, да. Я забыл об этом. да, добавлю. Спасибо. – rayryeng

2

Это, вероятно, не самый быстрый подход, но это просто:

  1. Использование importdata для чтения файла. Результатом является массив ячеек строк, каждая строка соответствует строке файла.
  2. Используйте regexp для извлечения чисел в каждой строке. Результатом является массив ячеек массивов ячеек. Первый уровень соответствует линиям, второй - номерам, обнаруженным в каждой строке.
  3. Удалите один уровень вложенности ячеек, чтобы получить массив ячеек строк (каждая строка, представляющая число), и примените str2double для преобразования в массив чисел.
  4. Перестройте в массив из двух строк и интерпретируйте как реальные мнимые части.

Код:

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 
+0

Мне нравится ваше использование 'regexp'! – rayryeng

Смежные вопросы