2

これまで、スペースで区切られたファイルを matlab の配列にロードするために load 関数を使用してきました。ただし、値が0または1であるため、これは多くのスペースを浪費します。したがって、次のようなファイルを書き込む代わりに

0 1 1 0 
1 1 1 0

スペースを削除して、次のような大きなファイルの半分を作成しました。

0110
1110

ただし、ロードが正しく機能しなくなりました (最初の数値のみでマトリックスを作成するため、2x4 ではなく 2x1 になります)。ファイルを1行ずつ読んだり、他の多くのものを読んだり、importdataを調べたりしましたが、明確な解決策が見つかりませんでした。したがって、本質的には、区切り記号を持たないファイルからマトリックスを読み取りたいと考えています。すべての数値は配列の要素です

これを行うためのクリーンな方法を知っている人はいますか? ありがとう

4

4 に答える 4

6

1 つの方法を次に示します。

data.txt

0110
1110

MATLAB

%# read file lines as cell array of strings
fid = fopen('data.txt','rt');
C = textscan(fid, '%s', 'Delimiter','');
fclose(fid);

%# extract digits
C = cell2mat(cellfun(@(s)s-'0', C{1}, 'Uniform',false));

結果:

C =
     0     1     1     0
     1     1     1     0

メモリが本当に気になる場合は、booleanC = logical(C)としてキャストする可能性があります。可能な値は 0/1 です。

于 2012-06-04T16:51:05.527 に答える
1

ここの例から適応:

function ret = readbin()
  fid = fopen('data.txt');
  ret = [];

  tline = fgetl(fid);
  while ischar(tline)
      if isempty(ret)
        ret = tline;
      else
        ret = [ret; tline];
      end
      tline = fgetl(fid);
  end

  % Turn char '0' into numerical 0
  ret = ret - 48;

  fclose(fid);
end

48 ('0' の ASCII コード) を引くと、適切な場所に 1 と 0 がある数値行列が得られます。これは、関数の最後に得られる出力です。

K>> ret
ret =
     0     1     1     0
     1     1     1     0
K>> class(ret)
ans =
double
于 2012-06-04T16:50:21.623 に答える
0

アムロのソリューションの別の形式は、次のいずれかです。

fid = fopen('data.txt','r');
C = textscan(fid, '%1d%1d%1d%1d');
fclose(fid);
M = cell2mat(C)

または

fid = fopen('data.txt','r');
M_temp = textscan(fid, '%1d');
fclose(fid);
M = reshape(M_temp{1}, 2,4)

これらは、最初に %1d 形式の数値 (1 文字の整数) を読み取り、はるかに単純な cell2mat コマンドを使用して変換できるセル配列 C を返すため、Amro のソリューションとは少し異なります。コードの 2 番目のビットは、これらの値のベクトルのみを読み取り、結果を再形成します。これは、データのサイズが既にわかっている場合は問題なく機能しますが、そうでない場合は追加の作業が必要になる場合があります。

実際のファイルが非常に大きい場合は、これらの方法のいずれかが高速であることに気付くかもしれませんが、実際に並べて実行しないとわかりません。

于 2012-06-04T19:38:33.057 に答える
0

この質問から着想を得て: Convert decimal number to vector、ここに命題がありますが、大きな「数値」ではうまくいかないと思います:

arrayfun(@str2double, str);
于 2012-06-04T16:54:29.563 に答える