使用单线模数函数生成非对称三角波?用于MATLAB

时间:2014-08-26 12:11:05

标签: matlab animation math graphics

Y = ABS(A-MOD(X,(A + 1)));

a = 0表示锯齿 对称三角形a = 1

https://flic.kr/p/oCJSHp

我需要使用单行模数函数来跟踪图像的功能

https://flic.kr/p/oCJs9V

2 个答案:

答案 0 :(得分:3)

Matlab的

(完全忽略c / c ++标签)
首先,函数是Piecewise,所以虽然它可以在一行中定义,但它更清楚地打破它然后重新组合......

你想要它做什么...

x=mod(x,1); 
if x <= 0.3
value = -1 / 0.3 * x + 1;  
else  %// x > 0.3
value = 1 / 0.7 * (x - 0.3);
end

如何在一行中完成...

在一行中复制if运算符可以通过逻辑测试可能的值,乘以解决方案并对所有术语求和来完成,

为什么?

如果为false,逻辑测试将返回0,如果为true则返回1,因此不需要的解将乘以0,并且所需的将乘以1.

所以(丑陋的)单行解决方案是:

(mod(x,1)<=0.3).*(1-1/0.3.*mod(x,1))+(0.3<mod(x,1)).*(1/0.7.*(mod(x,1)-0.3))

其中

(mod(x,1)<=0.3)                                           %// first logical test

(mod(x,1)<=0.3).*(1-1/0.3.*mod(x,1))                      %// times value if true

(mod(x,1)<=0.3).*(1-1/0.3.*mod(x,1))+(0.3<mod(x,1))   %//plus second logical test

(mod(x,1)<=0.3).*(1-1/0.3.*mod(x,1))+(0.3<mod(x,1)).*(1/0.7.*(mod(x,1)-0.3))
                                                          %// times value if true

结果

x=0:0.1:3;
f=(mod(x,1)<=0.3).*(1-1/0.3.*mod(x,1))+(0.3<mod(x,1)).*(1/0.7.*(mod(x,1)-0.3));
plot(x,f)

example image

答案 1 :(得分:0)

这是一个解决方案,适用于a_up=1a_down=0(第一种情况锯齿),a_up=1a_down=1(第二种情况,三角函数)和任何其他组合(例如a_up=0.7a_down=0.3,不对称三角波)

t=0:0.001:10;
ampl=2;

a_up=0.7;
a_down=0.3;
if a_down==0
    y=mod(t*(ampl/a_up),ampl);
else
    t_1= 0:0.001:a_up;
    t_2= 0:0.001:a_down;
   helper= unique(mod(t_1*(ampl/a_up),ampl));
   helper2= ampl-unique(mod(t_2*(ampl/a_down),ampl));
   signal= [helper, helper2];
   signal2= repmat(signal,1,ceil(numel(t)/numel(signal)));
   y= signal2(1:numel(t));
end
figure(1)
plot(t,y)

我的所作所为:

  • t是我的x轴
  • ampl我的幅度(图的范围从0到放大)
  • a_up达到最大值所需的时间间隔
  • a_down再次达到零所需的时间间隔
  • 我认为它区分大小写,否则a_down=0会出错
  • t_1,t_2是一个斜坡所需的时间间隔。
  • helper,helper2是上升或下降侧翼的信号
  • signal包含组合信号
  • signal2会定期重复,直到它与我的x轴相同或更大(t
  • y是缩减信号,因此其大小与t
  • 相同