MATLAB分段函数+向量操作

时间:2009-10-11 04:53:49

标签: matlab function vector

我想编写一个程序,在一定间隔上绘制一个半圆顶部的点,在其他地方绘制一条直线。这样的事情:__n__

我定义了一个时域,它被存储为一个向量(t = 0:0.01:5)。我假设我可以使用时间向量的元素定义半圆顶部的点:

if t>=2|t<=2.3
y = sqrt(.15^2-(t-2.15)^2);

但是MATLAB产生了一条错误信息,说只有方形矩阵可以被平方。

我试图利用指数来表明我想要对t向量的元素进行平方而不是整个向量:

i = [200:230];
for t(200:230)
y = sqrt(.15^2-(t(i)-2.15)^2);

在这些失败之后,我注意到用一列非零元素对方形矩阵求平方将产生一个新的方阵,其中第一个矩阵的元素的列被平方。如果在对矩阵求平方后有一些方法可以消除额外的零列,我可以使用矩阵的这个属性来平方t向量的值。

解决此问题的最简单,最有效的方法是什么?

2 个答案:

答案 0 :(得分:1)

坚持,所以你的问题是,你想要对矢量的每个元素进行平方?您所要做的就是:

t.^2

.表示矢量或数组上的element-wise operation in MATLAB

其次,如果我现在理解你的问题,你想创建一个向量y,它包含t元素的函数,使t>=2 | t <=2.3

如果是这样,你所要做的就是:

y = sqrt(0.15^2-(t( (t>=2|t<=2.3) )-2.15).^2));

基本上,我创建了一个逻辑索引(t>=2 | t<=2.3),并且只用t来访问那些(我想要的)元素。

另外,我并不完全理解你想要实现的 。您想绘制半圆曲线的最高点(最大值)吗?

答案 1 :(得分:1)

听起来你想画一条水平线,上面有一个半圆形的“凹凸”。这是你如何做到这一点:

t = 0:0.01:5;        % Create the time vector
y = zeros(size(t));  % Create a zero vector the same size as t
index = find((t >= 2) & (t <= 2.3));        % Find a set of indices into t
y(index) = sqrt(.15^2-(t(index)-2.15).^2);  % Add the "bump" to y
y(1:index(1)) = y(index(1));                % Add the line before the "bump"
y(index(end):end) = y(index(end));          % Add the line after the "bump"

在上述解决方案中,“凹凸”之前和之后的线条可能略高于或低于彼此(取决于t中的样本落在哪里)。如果你想确保它们处于同一高度,你可以改为:

index = (t >= 2) & (t <= 2.3);              % Find a set of logical indices
y(index) = sqrt(.15^2-(t(index)-2.15).^2);  % Add the "bump" to y
% OPTION #1:
y(~index) = y(find(index,1,'first'));  % Use the first circle point as the height
% OPTION #2:
y(~index) = y(find(index,1,'last'));   % Use the last circle point as the height

最后,您可以绘制线条:

plot(t,y);