如何在从数组创建线条时找到交叉点

时间:2014-09-26 14:40:21

标签: matlab math octave linear-algebra linear

下面推荐的交叉功能对于最多8000个值的数组效果很好但是如果我有一个100000或更多值的数组,我会耗尽内存,(我有16gig的ram)这很可能是由于由于具有交叉功能的repmat命令。

我正在尝试找到从数组创建的线的交叉点。但不断收到错误“ fzero:不是有效的初始包围”我正在使用 octave 3.8.1 (这是matlab的开源版本)下面的图片是我想要在交叉点处使用黑色圆圈。 我是否需要在for循环中使用fzero来循环遍历x和y值的数组?

clear all,clf, clc,tic

%freq array here
x1=[20,30,40,50,60,70,80]';
x2=[20,30,40,50,60,70,80]';
y1=[2,4,3,7,1,8,4]';
y2=abs(y1-max(y1)); %used to switch high and low amplitude of freq

%fit linear polynomial
p1 = polyfit(x1,y1,1);
p2 = polyfit(x2,y2,1);  

%calculate intersection
x_intersect = fzero(@(x) polyval(p1-p2,x),3);
y_intersect = polyval(p1,x_intersect);

line(x1,y1);
hold on;
line(x2,y2);
plot(x_intersect,y_intersect,'r*')

下面推荐的交叉功能对于最多8000个值的数组效果很好但是如果我有一个100000或更多值的数组,我会耗尽内存,(我有16gig的ram)这很可能是由于由于具有交叉功能的repmat命令。

So now I'm trying to:
1) cycle though each row in the array which represents a line 

linea1-6 xvalues = 20 to 30, 30 to 40, 40 to 50, 50 to 60, 60 to 70, 70 to 80
linea1-6 yvalues =2 to 4, 4 to 3, 3 to 7, 7 to 1, 1 to 8, 8 to 4
lineb1-6 xvalues = 20 to 30, 30 to 40, 40 to 50, 50 to 60, 60 to 70, 70 to 80
lineb1-6 yvalues =6 to 4, 4 to 5, 5 to 1, 1 to 7, 7 to 0, 0 to 4

**I'm having problems coding the for loop to work with polyfit and fzero**


2) store the intersection values found for each line into an array.
This should solve running out of memory issues when using large arrays 

enter image description here

1 个答案:

答案 0 :(得分:0)

我不确定您为何没有使用上一个问题Finding where plots may cross with octave / matlab

的解决方案

但是这里发生了什么(来自文档):

  

如果X0是单个标量,那么附近的几个值就是   试图获得有效的包围。如果不是这样的话   成功,功能失败。

所以发生的事情是你对3的初步猜测离解决方案太远了。试试这个:

>> x_intersect = fzero(@(x) polyval(p1-p2,x),30)
x_intersect =  46.667

但是,我不确定你要通过为数据拟合一次多项式来做什么,这对我来说没有意义......