通过匹配子字符串对字符串进行分组

时间:2012-04-17 05:27:47

标签: matlab

运行SPICE模拟后,我得到一个.a2d文件,我用Matlab解析。解析文件后,我得到一个包含变量名称的单元格数组 例如:vars = {'s0';'s1';'s2';'a0';'a1'} 以及具有信号转换的数据矩阵,其中每行表示每个信号的数据,列表示时间。所有数据都是二进制的,即它只有0或1。

我想要做的是创建一个算法,根据存储在变量中的名称检测“单词”。例如,s0,s1和s2组成一个3位字's'; a0和a1是一个2位字'a'。 最后,我需要的是将每个单词的数据矩阵分成一个数组(从二进制转换为十进制)。

我是手工做的,但我想知道脚本是否有办法做到这一点。

1 个答案:

答案 0 :(得分: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

输出结束于以变量的字符串部分命名的字段

output = 

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