【问题标题】:Repeating parts of a cell array column in Matlab在Matlab中重复单元格数组列的部分
【发布时间】:2017-09-22 18:44:00
【问题描述】:

我在 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

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

谢谢

【问题讨论】:

    标签: arrays matlab for-loop cell-array


    【解决方案1】:

    您可以通过一种非循环方式来完成此操作。请注意,以下代码被泛化为处理任何长度标签或空格数(即任何全空格条目都将被前一个标签覆盖):

    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);
    

    【讨论】:

    • 您好,感谢您的回答,但我在运行此程序时收到错误 Undefined function 'repelem' for input arguments of type 'double'....
    • @MaheenSiddiqui:在引入repelem 时,您必须使用早于 R2015a 的 MATLAB 版本。我会相应地更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2015-10-18
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多