使用循环在MATLAB中将元素添加到现有向量

时间:2014-01-30 21:17:32

标签: matlab loops vector matrix

我在MATLAB中有一个1x1033列向量,主要由零组成 - 每隔一段时间,有两个相邻的数字是零的一边(即如果第一个数字是正数,第二个数字是负数和副数字反之亦然)。我试图在这两个值之间输入零而不在矩阵中的任何其他点添加零。我以为我有它,但我的循环只在前两个非零值之间加零,而忽略其余的。

任何帮助都将不胜感激。

我的代码如下所示: 对于h = n:-1:1;     zero_crossing_markers(H);

if zero_crossing_markers(h) > 0 && zero_crossing_markers(h+1) < 0;
    %zero_values_added = [zero_crossing_markers(1:h), 0, zero_crossing_markers(h+1:n)];
    A = zero_crossing_markers(1:h);
    B = 0;
    C = zero_crossing_markers(h+1:n);
    zero_values_added = [A, B, C];

    else if zero_crossing_markers(h) < 0 && zero_crossing_markers(h+1) > 0;
        %zero_values_added = [zero_crossing_markers(1:h), 0, zero_crossing_markers(h+1:n)];
        A = zero_crossing_markers(1:h);
        B = 0;
        C = zero_crossing_markers(h+1:n);
        zero_values_added = [A, B, C];

    else
        zero_values_added(h) = 0;
        end
end

2 个答案:

答案 0 :(得分:2)

不需要循环。它可以用矢量化的方式在一行中解决:

clear result
data = [1 -2 0 0 0 2 -3 0 0 5 -1 2 0 1 1]; %// example data

result((1:numel(data)) + [0 cumsum(abs(diff(sign(data)))==2)]) = data;

对于此示例,

result =
  Columns 1 through 15
     1     0    -2     0     0     0     2     0    -3     0     0     5     0    -1     0
  Columns 16 through 19
     2     0     1     1

这是如何工作的:我们的想法是将data拉伸到result,以便自动插入零。从abs(diff(sign(data)))==2获得将发生拉伸并将插入零的位置:此向量中的1值表示以下位置应为插入的零。 cumsum用于累积所有拉伸。

答案 1 :(得分:1)

这就是诀窍:

x = [0 1 -2 0 3 -4 0 0]';
y = zeros(size(x,1) + nnz(x>0),1);
ix = find(x > 0);
ix = ix + (0:numel(ix) - 1)'
ix2 = ix + 2;
y(ix) = x(x > 0);
y(ix2) = x(x < 0);
y =
     0
     1
     0
    -2
     0
     3
     0
    -4
     0
     0