【问题标题】:converting elements in a vector in matlab在matlab中转换向量中的元素
【发布时间】:2013-11-14 11:04:29
【问题描述】:

对于一个项目,我试图在向量中找到一系列的第一个。例如,我有输入:

x1=[1 0 0 1 1 1 0 1 0 1 0 0 1 1]

我需要作为输出:

Y1=[1 0 0 1 0 0 0 1 0 1 0 0 1 0]

所以每次向量中有一个1,所有后续的都需要变成零。

我有以下代码,但由于某种原因,它只返回与 x1 完全相同的值的 Y1。

n=numel(x1);
Y1=zeros(n,1);
for i = 1:n
if x1(i) == 1
    Y1(i)= 1;
    for j = (i+1): n 
        if x1(j)== 1
            Y1(j)=0;
        elseif x1(j) == 0
            Y1(j)=0;
            i=j+1;
            break
        end
    end
elseif x1(i) == 0
    Y1(i)= 0;
end

end

任何帮助将不胜感激。

【问题讨论】:

    标签: matlab vector break elements


    【解决方案1】:

    diff 很容易。不需要循环。

    Y1 = [ x1(1) diff(x1)==1 ];
    

    或等效

    Y1 = diff([0 x1])==1;
    

    这是如何工作的diff 计算一个元素相对于前一个元素的差异。当该差异为 1 时,新一轮的运行已开始。第一个元素需要特殊处理。

    【讨论】:

    • @user2991702 欢迎 :-) 如果您是 Matlab 新手,请尝试做“矢量化”的事情(如我的回答)。在很多情况下,循环会在其他语言中使用,但在 Matlab 中,它可以通过一些矢量化操作(例如 diffsum 等)更容易(通常更快)完成。
    【解决方案2】:

    @Luis 对您的向量不仅包含零和一的情况的答案的概括:

    Y1 = diff([0 x1]) & x1 == 1
    

    这会检查该值是否为 1,以及它是否与之前的值不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多