我在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
端
答案 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