我有MFCC特征矩阵" ceps",并且假设20点的数组如下,
sp=[200 400 500 ........7568]
我希望在两个段之间进行比较,例如:)比较1到200(一个段)和200到400(第二段)的要素数据值。比较工作的价值将是负数或正数....我已将所有这些值存储在一个向量
中a=zeros((length(sp)-1),1)
a=a';
cont=0;
for i=1:length(sp)-1
cont=cont+1;
if cont==1
ceps1=ceps(:,1:sp(i));
obj=gm.distribution.fit(ceps1',1,'options',options);
y=-obj.NlogL;
else
ceps1=ceps(:,sp(i):sp(i+1));
obj=gm.distribution.fit(ceps1',1,'options',options);
y=-obj.NlogL;
end
ceps2=ceps(:,sp(i):sp(i+1));
[m n]=size(ceps2');
y1=-obj.NlogL;
if cont==1
ceps3=ceps(:,1:sp(i+1));
obj=gm.distribution.fit(ceps3',1,'options',options);
y2=-obj.NlogL;
else
ceps3=ceps(:,sp(i-1):sp(i+1));
obj=gm.distribution.fit(ceps3',1,'options',options);
y2=-obj.NlogL;
end
a(i+1)=y1+y-y2;
end
上面的结果是具有所有比较值的向量,有些是负数,有些是正数....在上述程序中,迭代是连续执行的,例如:对于第一次迭代,比较在第一段之间(即:从1到200)和第二段(即:从200到400),在第二次迭代中,比较在第二段(200到400)和第三段(400到500)之间。
但现在我想修改它,因为在第一次迭代中,比较应该在第一段(1到200)和第二段(200到400)之间。比较的结果将是正面的或负面的。 / p>
CASE1: 如果它是负的,那么指向绿色并移动第二次迭代,我们将在第二段(200到400)和第三段(400到500)之间进行比较
CASE2: 如果结果为正,我们会将该点保持为绿色,但现在在下一次迭代中,比较在第一段(1到400)和第二段(400到500)之间。
sp矢量有20个值,现在我通过给每个点赋予属性来绘制图表上的20个值。
figure
plot(sp,'--rs','markeredgecolor','k','markerfacecolor','g','markersize','2');
现在我如上所述对每个点进行处理,结果将为正或负。 如果结果为负,那么我需要更改处理的那个点的颜色属性。 如果它是正数,那么它应保持不变。
所以我需要一个图表,其中负值点应为红色,其他所有值(正值pts)应为绿色。
最后它应该丢弃图中的所有绿点
我该怎么做......
答案 0 :(得分:1)
我编写了一个简单的例子,演示如何根据循环中的值更改点颜色。
t = 0:0.03:3;
y = sin(2*pi.*t);
figure; hold on;
plot(t,y,'k');
grid;
for i=1:length(x)
%Select color
if y(i)<0
mycolor = 'r';
else
mycolor = 'g';
end
plot(t(i), y(i), 'sk','markersize',8,'markerfacecolor',mycolor);
end
或者你可以用更典型的MATLAB方式来实现它:
idx_neg = (y<0);
idx_pos = ~(idx_neg);
x_neg = x(idx_neg);
y_neg = y(idx_neg);
x_pos = x(idx_pos);
y_pos = y(idx_pos);
figure;
plot(x_neg,y_neg,'sk','markersize',8,'markerfacecolor','r');
plot(x_pos,y_pos,'sk','markersize',8,'markerfacecolor','g');
您应该可以轻松地将其用于您的代码,但我会留给您!
<强>输出:强>
当你完成时,不要丢弃图中的所有绿点,为什么不只绘制红点。