在Matlab中重复单元阵列列的部分

时间:2017-04-25 16:15:36

标签: arrays matlab for-loop cell-array

我在Matlab中有一个包含2列的单元格数组:

x = {'A', 0
     ' ', 1
     ' ', 1
     'B', 1
     ' ', 0 
     ' ', 1 
     'C', 1
     ' ', 0 
     ' ', 1}

我基本上想要编写一个循环,它将查看第1列的所有元素,例如,如果它找到A然后为''的下两行,我希望它将它们标记为A好。然后,如果它找到B然后用B替换接下来的两行,然后用C ......替换......

我尝试使用repmat:

for i=1:size(x,1)
      a=repmat({x(i,1),3,1});
end 

我也试过这个:

b = {};
for i = 1:size(x,1)
b = {b repmat(x{i,1}, 3, 2)};
end

但我没有得到理想的结果。 有人可以帮忙吗?

由于

1 个答案:

答案 0 :(得分:3)

你可以通过非循环方式实现这一目标。请注意,以下代码被概括为处理任何长度标签或空格数(即任何全空格条目将被前一个标签覆盖):

labelIndex = find(~cellfun(@(s) all(isspace(s)), x(:, 1)));
nRepeats = diff([labelIndex; size(x, 1)+1]);
x(:, 1) = x(repelem(labelIndex, nRepeats), 1)

x =

  9×2 cell array

    'A'    [0]
    'A'    [1]
    'A'    [1]
    'B'    [1]
    'B'    [0]
    'B'    [1]
    'C'    [1]
    'C'    [0]
    'C'    [1]

要解释上述内容...首先,找到第一列不是所有空格的行的索引(使用findcellfunisspace)。然后,获取这些索引之间的差异(以及超过行尾的一个)以获得每个标签必须重复的次数的数组(使用diff)。最后,使用repelem复制每个标签必要的次数,并将结果用作原始数组行的索引。

注意:在MATLAB版本R2015a之前没有引入repelem函数,所以如果你的版本比那个版本旧,那么你必须使用其中一个解决方案% First two lines same as above... clens = cumsum(nRepeats); index(clens(end)) = 0; index([1; clens(1:end-1)+1]) = diff([0; labelIndex]); x(:, 1) = x(cumsum(index), 1); 。 3}}用于最后一步。例如:

{{1}}