2013-04-14 2 views
0

Я уже реализовал свой алгоритм, используя ячейки нескольких строк в Matlab, но я не могу это сделать, читая файл.Алгоритм поиска слов с использованием файла m.file

В Matlab я создаю ячейки строк для каждой строки, назовем их строкой.

Так я получаю

 line= 'string1' 'string2' etc 
    line= 'string 5' 'string7'... 
    line=... 

и так далее. У меня есть более 100 строк для чтения.

Что я пытаюсь сделать, это сравнить слова от первой строки к себе. Затем объедините первую и вторую строки и сравните слова во второй строке с объединенной ячейкой. Я накапливаю каждую ячейку, которую я читаю, и сравниваю с последней прочитанной ячейкой.

Вот мой код на

для каждой строки = а, б, в, г, ...

for(i=1:length(a)) 
for(j=1:length(a)) 
    AA=ismember(a,a) 
    end 

    combine=[a,b] 
    [unC,i]=unique(combine, 'first') 
    sorted=combine(sort(i)) 

    for(i=1:length(sorted)) 
for(j=1:length(b)) 
    AB=ismember(sorted,b) 
end 
end 

combine1=[a,b,c] 

..... Когда я прочитал мой файл, я создаю while, который читает весь скрипт до конца, так как я могу реализовать свой алгоритм, если все мои ячейки строк имеют одинаковое имя?

while~feof(fid) 
    out=fgetl(fid) 
    if isempty(out)||strncmp(out, '%', 1)||~ischar(out) 
    continue 
    end 
    line=regexp(line, ' ', 'split') 
+0

Мне кажется, что вы можете прочитать весь файл, а затем просто назвать уникальным. Однако файл может быть нерегулярным и может вызвать проблему. – Oleg

ответ

0

Предположим, что файл данных называется data.txt и его содержание:

string1 string2 string3 string4 
string2 string3 
string4 string5 string6 

очень простой способ сохранить только первый уникальный случай является:

% Parse everything in one go 
fid = fopen('C:\Users\ok1011\Desktop\data.txt'); 
out = textscan(fid,'%s'); 
fclose(fid); 

unique(out{1}) 
ans = 
    'string1' 
    'string2' 
    'string3' 
    'string4' 
    'string5' 
    'string6' 

Как уже упомянутый, этот подход может не работать, если:

  • файл данных имеет неровности
  • вы на самом деле нужны показатели сравнения

EDIT: решение для выполнения

% Parse in bulk and split (assuming you don't know maximum 
%number of strings in a line, otherwise you can use textscan alone) 

fid = fopen('C:\Users\ok1011\Desktop\data.txt'); 
out = textscan(fid,'%s','Delimiter','\n'); 
out = regexp(out{1},' ','split'); 
fclose(fid); 

% Preallocate unique comb 
comb = unique([out{:}]); % you might need to remove empty strings from here 

% preallocate idx 
m = size(out,1); 
idx = false(m,size(comb,2)); 

% Loop for number of lines (rows) 
for ii = 1:m 
    idx(ii,:) = ismember(comb,out{ii}); 
end 

Обратите внимание, что в результате idx является:

idx = 
    1  1  1  1  0  0 
    0  1  1  0  0  0 
    0  0  0  1  1  1 

Преимущество сохранения в этой форме заключается в том, что вы сохраняете пространство по отношению к массиву ячеек (что накладывает 112 байтов служебных данных на ячейку). Вы также можете сохранить его как разреженный массив, чтобы потенциально повысить затраты на хранение.

Другое дело, что даже если логический массив длиннее, например, двойной массив, который индексируется, если превышение элементов является ложным, вы все равно можете его использовать (и, построив вышеуказанную проблему, idx удовлетворяет этому требованию). Пример:

A = 1:3; 
A([true false true false false]) 
+0

Мне нужно сравнить каждый индекс строки, скажем, комбинацию той, что была выше. Поэтому я должен иметь возможность реализовать код, который я написал выше, при чтении файла. Все матрицы различаются по количеству слов, которые она имеет, но я просто собираюсь дать всем матрицам длину самой длинной матрицы. Мне нужно, чтобы каждая строка оставалась в правильном порядке, так как в конце мне приходится сравнивать предложения, чтобы увидеть сходство в словах. И каждая строка должна иметь матрицу логического значения, если слово в этой строке отображается в объединенной матрице – Samira

+0

ans = [1 1 1 1] для первой строки, ans = [0 1 1 0] для второй строки, ans = [0 0 0 1 1 1] для последней строки, поэтому у меня есть строка1 по сравнению с линией 1, затем строка 2 по сравнению с линией1 + строка 2, затем строка 3 по сравнению с линией1 + строка2 + строка3 и т. Д., Я надеюсь, что это очистит вещи вверх – Samira

+0

Хорошо, я все равно буду импортировать навалом, но сохраняя позиционирование. Я скоро обновлю ответ. – Oleg

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