2012-04-17 32 views
1

SPICEシミュレーションを実行した後、私はMatlabで解析している.a2dファイルを取得します。ファイルを解析すると、変数の名前を持つセル配列が得られます 例:vars = {'s0'; 's1'; 's2'; 'a0'; 'a1'} と信号遷移を持つデータ行列各行は各信号のデータを表し、列は時間を表す。すべてのデータはバイナリです。すなわち、0または1だけです。部分文字列を一致させて文字列をグループ化する

私がしたいことは、varsに保存されている名前に基づいて「単語」を検出するアルゴリズムを作成することです。たとえば、s0、s1、およびs2は3ビットのワード 's'を形成します。 a0、a1は2ビットの語aである。 最後に、データ行列を単語ごとに1つの配列に分割する(2進数から10進数に変換する)必要があります。

私は手でそれをやっていますが、スクリプトでそれを行う方法があるかどうかを知りたいと思います。

答えて

0

最終的な値を構造体のフィールドに入れることができます。私は変数名とシフトを抽出するために正規表現を使用しました。

% fake data 
vars = {'sums4', 'sums2', 'sums1', 'a0', 'a5'}; 
data(1,:) = logical([0 0 1 0 0 0 1]); 
data(2,:) = logical([0 1 1 1 1 0 0]); 
data(3,:) = logical([1 0 1 1 0 0 1]); 
data(4,:) = logical([0 0 1 0 1 1 1]); 
data(5,:) = logical([0 1 1 1 0 0 0]); 

output = struct(); 
for i = 1:length(vars) 
    matches = regexp(vars{i}, '(\D+)(\d+)', 'tokens'); 
    var = matches{1}{1}; 
    shiftsize = str2num(matches{1}{2}); 

    % initialise if not already present 
    if (~isfield(output, var)) 
     output.(var) = zeros(1, size(data, 2)); 
    end 

    % add apropriate shifted value to current values 
    output.(var) = output.(var) + (bitshift(1, shiftsize) * data(i, :)); 
end 

出力はVARS

output = 

    sums: [2 4 22 6 4 0 18] 
     a: [0 32 33 32 1 1 1] 
+0

こんにちは@Alex、コードのthaksの文字列の一部にちなんで名付けられたフィールドで終わり、それは素晴らしい作品! おそらく私はそれを明確にしていないかもしれないちょっとした小さな修正です。 varsに数値で仕上げることなくいくつかのフィールドが含まれていると、コードにエラーが発生します(通常は1ビット信号の場合です)。 とにかくif文を追加してコードにこの変更を加えました。 'if(〜isempty(マッチ))' 'var = vars {i};' 'shifttsize = 0' 'else' 'var = 1と一致{1}' 'shifttsize = str2num({1} {2}と一致);' 'end' –

関連する問題