arrays - Matlab 中元胞数组列的重复部分

标签 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

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

谢谢

最佳答案

有一种非循环方式可以实现这一点。请注意,以下代码被通用化以处理任何长度的标签或空格数量(即任何全空格条目将被前一个标签覆盖):

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将每个标签复制必要的次数,并将结果用作原始数组行的索引。


注意: 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/

相关文章:

php - 简单的for循环不起作用

r - 我如何在R中可能想要循环零次的for循环中制定公式?

Java Split 丢弃空数组元素

c++ - 在 C++ 中创建一个以 6 为基数的大型数组?

matlab - 如何在matlab中将一个矩阵的每一行乘以另一个矩阵的相应列?

matlab - 如何创建文章质量的 3-D 图?

matlab - 在同一个图表中绘制许多水平条形图

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

c++ - 如何使用数组解决这个问题?

for-loop - 如果有 scanf,为什么循环时会得到重复的输出?