我在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
但我没有得到理想的结果。 有人可以帮忙吗?
由于
答案 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]
要解释上述内容...首先,找到第一列不是所有空格的行的索引(使用find
,cellfun
和isspace
)。然后,获取这些索引之间的差异(以及超过行尾的一个)以获得每个标签必须重复的次数的数组(使用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}}