0

我已经在 Matlab 上使用多个字符串的单元格实现了我的算法,但我似乎无法通过读取文件来做到这一点。

在 Matlab 上,我为每一行创建字符串单元格,我们称它们为行。

所以我得到

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

等等。我有超过 100 行要阅读。

我想要做的是将第一行的单词与自身进行比较。然后将第一行和第二行合并,并将第二行中的单词与合并的单元格进行比较。我累积读取的每个单元格,并与读取的最后一个单元格进行比较。

这是我的代码

对于每一行 = a,b,c,d,...

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')
4

1 回答 1

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'

如前所述,如果出现以下情况,此方法可能不起作用:

  • 您的数据文件有违规行为
  • 你实际上需要比较指数

编辑:性能解决方案

% 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])
于 2013-04-15T10:47:09.307 回答