我在 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
但我没有得到想要的结果。 有人可以帮忙吗?
谢谢
最佳答案
有一种非循环方式可以实现这一点。请注意,以下代码被通用化以处理任何长度的标签或空格数量(即任何全空格条目将被前一个标签覆盖):
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
将每个标签复制必要的次数,并将结果用作原始数组行的索引。
注意: repelem
函数直到 MATLAB R2015a 版本才引入,因此如果您的版本比该版本更旧,则必须使用其中一种解决方案来自this question最后一步。例如:
% 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);
关于arrays - Matlab 中元胞数组列的重复部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43615967/