在matlab中连接向量
你好 我需要构造向量xx和yy。问题是,在每个周期,过去的xx和yy都会被删除,但我想要的是相反的结果。我希望他们保留过去的信息,并在每个周期中成长。我能做什么?我也知道我应该预先分配xx和yy 谢谢你的帮助。多谢各位 **这是一个可能的解决办法。这里的问题是我需要预先分配。但如果我这样做,xx和yy保留了零,并继续增长,而“零在里面”,这是错误的 :在matlab中连接向量,matlab,vector,concatenation,Matlab,Vector,Concatenation,你好 我需要构造向量xx和yy。问题是,在每个周期,过去的xx和yy都会被删除,但我想要的是相反的结果。我希望他们保留过去的信息,并在每个周期中成长。我能做什么?我也知道我应该预先分配xx和yy 谢谢你的帮助。多谢各位 **这是一个可能的解决办法。这里的问题是我需要预先分配。但如果我这样做,xx和yy保留了零,并继续增长,而“零在里面”,这是错误的 : 您需要在xx和yy中明确说明要放置数据的位置。从您的代码中很难理解您想要它的位置,但它应该在下面几行中找到一些东西 distances = sq
您需要在
xx
和yy
中明确说明要放置数据的位置。从您的代码中很难理解您想要它的位置,但它应该在下面几行中找到一些东西
distances = sqrt((x - max(x)).^2 + (y - max(y)).^2);
[peaks, iPeaks] = findpeaks(distances);%to find out where the curve turns around
xx=[];
yy=[];
for i = 1 : length(iPeaks)-1
iPeaks1 = iPeaks(i);
iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
%skip small noise peaks
if length(iPeaks1:iPeaks2)>=5
xx = [xx; x(iPeaks1:iPeaks2)];%''concatenate''(connect)
yy = [yy; y(iPeaks1:iPeaks2)];
end
end
对于yy
也一样<代码>开始你必须自己计算
另一方面,如果您想将新的x
和y
向量部分附加到xx
和yy
的末尾,您可以这样做
start = some_index_in_xx;
v = x(iPeaks1:iPeaks2);
xx(start:start+numel(v)-1)=v;
您必须在循环之前初始化xx
和yy
:
xx = [xx x(iPeaks1:iPeaks2)];
yy = [yy y(iPeaks1:iPeaks2)];
使用串联可以轻松地增长向量:
xx = [];
yy = [];
在你的情况下,你会这样做
x = [1, 2, 3];
y = [4, 5, 6, 7];
z = [x, y]; %# z will be [1, 2, 3, 4, 5, 6, 7]
独立于iPeaksNoise
的形状(即,无论是行还是
列向量)您可以使用
%# Start with an empty vector.
xx = [];
for i = 1 : length(iPeaksNoise)-1
[...]
xx = [xx, x(iPeaks1:iPeaks2)];
end
预分配意味着创建一个零向量,该向量具有最终输出的长度。你会这样做吗
for [...]
t = x(iPeaks1:iPeaks2);
xx = [xx; t(:)];
end
然而,在你的情况下,你有额外的困难,不知道最终的大小
因为您不知道length(iPeaks1:iPeaks2)>=5的频率
在循环内完成
编辑:
预分配为xx
的代码可能如下所示:
final_size = what_so_ever;
xx = zeros(final_size, 1);
start_index = 1;
for [...]
t = x(iPeaks1:iPeaks2);
xx(start_index : start_index + length(t) - 1) = t;
start_index = start_index + length(t);
end
在这里,我假设在每次迭代中要添加到xx和yy的元素的数量不是每次都相同。然后,如果你想预先分配空间,你需要知道你要加多少。因此,如果有一个额外的循环,代码将变得更加复杂。一个版本可能是
distances = sqrt((x - max(x)).^2 + (y - max(y)).^2);
[peaks, iPeaks] = findpeaks(distances);
%# Compute the distance between two peaks.
peakDistance = diff(iPeaks);
%# Filter peaks which are of length 5 or less.
peakMask = peakDistance > 5;
finalSize = sum(peakDistance(peakMask));
%# Copy the values in a new vector.
xx = zeros(1, finalSize);
idx = 1;
for count = 1 : length(peakDistance)
if peakMask(count)
pD = peakDistance(count);
xx(idx : idx + pD - 1) = x(iPeaks(count) : iPeaks(count) + pD - 1);
idx = idx + pD;
end
end
但是,这是matlab。你不应该这么做。下面是一些代码,它们使用逻辑标志执行相同的操作,只需一次删除所有小峰值:
x=(5*sin(0:(pi/100):2*pi)+rand(201,1)'-0.5)';
y=(5*cos(0:(pi/100):2*pi)+rand(201,1)'-0.5)';
%%
distances = sqrt((x - max(x)).^2 + (y - max(y)).^2);
[peaks, iPeaks] = findpeaks(distances);%to find out where the curve turns around
counterx = 0;
for i = 1 : length(iPeaks)-1
iPeaks1 = iPeaks(i);
iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
%skip small noise peaks
if length(iPeaks1:iPeaks2)>=5
counterx =counterx+ iPeaks2-iPeaks1+1;
end
end
xx=zeros(counterx,1);
yy=xx;
counterx=0;
clc
for i = 1 : length(iPeaks)-1
iPeaks1 = iPeaks(i);
iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
%skip small noise peaks
if length(iPeaks1:iPeaks2)>=5
% xx = [xx; x(iPeaks1:iPeaks2)];%''concatenate''(connect)
% yy = [yy; y(iPeaks1:iPeaks2)];
counterx=counterx+1;
xx(counterx:counterx+iPeaks2-iPeaks1) = x(iPeaks1:iPeaks2);
yy(counterx:counterx+iPeaks2-iPeaks1) = y(iPeaks1:iPeaks2);
counterx=counterx+iPeaks2-iPeaks1;
end
end
disp([xx yy]')
%查找与下一个ipeak相距5的所有ipeak
peakdiffs=find((iPeaks(2:end)-iPeaks(1:end-1)-1)>=5);
%快速创建与x相同大小的逻辑阵列
对不起,你席的意思是“开始=某事索引xxx”?我想从一开始就填写xx,那么1?我改变了问题并绘制了所有代码。也许你更容易帮助我。非常感谢您。如果您预先分配了xx,那么它有一个初始大小(例如xx=0(11000)
。你的向量v
是,比方说,10个元素。你想把它放在xx
的哪里?从哪个索引开始?你能看到我在问题空间中写的解决方案吗?你知道我能做些什么来解决它吗?非常感谢。我想你把事情搞混了。你没有预先分配xx
和yy
。您将它们初始化为空。然后添加到它们的是您的数据,而不是一些不需要的零。好吧,是的,这就是问题所在。您能看看我在“问题空间”中编写的新代码吗。您知道我可以做些什么来解决问题吗?非常感谢。@user1675777:我添加了一个基于您的ed的预分配示例信息技术
x=(5*sin(0:(pi/100):2*pi)+rand(201,1)'-0.5)';
y=(5*cos(0:(pi/100):2*pi)+rand(201,1)'-0.5)';
%%
distances = sqrt((x - max(x)).^2 + (y - max(y)).^2);
[peaks, iPeaks] = findpeaks(distances);%to find out where the curve turns around
counterx = 0;
for i = 1 : length(iPeaks)-1
iPeaks1 = iPeaks(i);
iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
%skip small noise peaks
if length(iPeaks1:iPeaks2)>=5
counterx =counterx+ iPeaks2-iPeaks1+1;
end
end
xx=zeros(counterx,1);
yy=xx;
counterx=0;
clc
for i = 1 : length(iPeaks)-1
iPeaks1 = iPeaks(i);
iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
%skip small noise peaks
if length(iPeaks1:iPeaks2)>=5
% xx = [xx; x(iPeaks1:iPeaks2)];%''concatenate''(connect)
% yy = [yy; y(iPeaks1:iPeaks2)];
counterx=counterx+1;
xx(counterx:counterx+iPeaks2-iPeaks1) = x(iPeaks1:iPeaks2);
yy(counterx:counterx+iPeaks2-iPeaks1) = y(iPeaks1:iPeaks2);
counterx=counterx+iPeaks2-iPeaks1;
end
end
disp([xx yy]')
% find all the iPeaks that are 5 apart from the next one
peakdiffs = find((iPeaks(2:end)-iPeaks(1:end-1)-1)>=5);
% make a logical array quickly with same size as x
removeflag = x<=inf;
for i=1:numel(peakdiffs)
% for each peak that is bigger than your threshold, those parts of the
% logical array will be made false.
removeflag(iPeaks(peakdiffs(i)):iPeaks(peakdiffs(i)+1)-1)=false;
end
%remove all indices in x,y that are still false in removeflag and store in xx
%and yy resp
xx= x; xx(removeflag)=[];
yy= x; yy(removeflag)=[];
disp([xx yy]')