0

Matlab で複数の文字列のセルを使用してアルゴリズムを既に実装していますが、ファイルを読み取っても実行できないようです。

Matlab では、行ごとに文字列のセルを作成します。これを行と呼びましょう。

だから私は得る

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

等々。100行以上読む必要があります。

私がやろうとしているのは、最初の行からの単語をそれ自体と比較することです。次に、1 行目と 2 行目を結合し、2 行目の単語を結合セルと比較します。読み取った各セルを蓄積し、最後に読み取ったセルと比較します。

これが私のコードです

各行 = 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 バイトのオーバーヘッドが発生します)。また、スパース配列として保存して、ストレージ コストを改善することもできます。

注意すべきもう 1 つのことは、logical 配列がインデックス付けされている double 配列などよりも長い場合でも、超過要素が false である限り、引き続き使用できることです (上記の問題の構築により、idx はこの要件を満たします)。 . 明確にする例:

A = 1:3;
A([true false true false false])
于 2013-04-15T10:47:09.307 に答える