0

matlabに読み込む必要のあるテキストファイルがあります。構造を使用して、MatlabにjavaLinkedHashMapのようなものを実装したいと思います。私のテキストファイルはこんな感じです

3-1 33.33 37.58

3-1 66.67 20.47

3-2 33.33 41.64

3-2 66.67 24.42

ファイル全体を配列に読み込みます[a,x,y]。ここで、aは3-1と3-2を含むセル配列です。

フィールド名をa(1)またはa(2)にする構造が必要ですが、残念ながらmatlabでエラーが発生します。その理由は、たとえばa(1)がすでに構造体フィールド名であるかどうかを確認する必要があるためです。値を前の値に連結します。そうでない場合は、尊重された値で新しいフィールド名を作成します。コードは次のとおりです。

[a,x,y]=textread('mytxt.txt', '%q%f%f','commentstyle','matlab');

s.a(1)=[x(1),y(1)];

for j=2:length(a)

    if isfield(s,a(1))==0

        s.a(j)=[x(j),y(j)];

     else

        temp = s.a(j);

        C = concat(1,temp,[x(j),y(j)];

        s.a(j) = C

    end

end 
4

1 に答える 1

2

おそらく、フィールド3-1、3-2、...、3-nを持つ構造体としてsが必要です。また、MATLABの動的フィールド名を使用して作成したいと思います。

セル配列内のセルを介して動的にフィールドにアクセスするには、次のようなことを行う必要があります。

s.(a{j}) = [x(j), y(j)];

括弧()と中括弧{}のさまざまな使用法をメモします。括弧は、s。(str)のように動的フィールド名を示すためのものです。ここで、strは文字配列です。中括弧は、 a {j}のようにセル配列aにインデックスを付けるために使用され、aのj番目のセル文字配列を示します。

最後に、提案されたフィールド名(3-1、3-2、...など)は、ハイフン'-'のため、MATLABの正当なフィールド名ではなく、文字[a-zA-Z ]。したがって、ハイフンを別の文字、たとえばアンダースコアに置き換えて、提案されたフィールド名の先頭に文字を追加する必要があります。

  1. 次のようにstrrepを使用してハイフンを置き換える

    a = strrep(a、'-'、'_');

  2. フィールド名の先頭に文字を追加する

    a = cellfun(@(str)['a_' str]、a、'uniformoutput'、0)

この作業は、ファイルを行列ax、およびyに読み込み終えた直後に実行できます。

于 2012-12-18T21:36:20.020 に答える