2014-09-26 50 views
0

下面推薦的十字路口功能對於數組達到8000個值非常適用,但如果我有一個100000個或更多數值的數組,我會耗盡內存(和I有16g內存),這很可能是由於具有交集函數的repmat命令引起的。如何找到從陣列創建線條時的交點

我試圖找到從數組創建的線的交點。但不斷收到錯誤「fzero:不是一個有效的初始包圍」我正在使用八度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個值偉大的工作,但如果我有10萬個值的數組或更多我會耗盡內存,(我有RAM的16gig)這個最有可能是由於具有交叉函數的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

+0

我不熟悉你使用的語言;不過,在聲明x1,x2和y1的行末尾有單引號。也許這與你的問題有關? – Bobort 2014-09-26 14:47:06

+0

@Ander Biguri不,它不是重複的,請閱讀更新的問題原始答案不適用於大型數組。 – 2014-09-26 15:29:46

+0

我認爲這將有助於如果你能更好地描述你的輸入數據。 X2總是等於x1,並且它們是等間隔和單調的嗎?僅在您的示例中,y2 = abs(y1-max(y1))。如果我們能夠做出這些假設,這將大大簡化計算。在這種情況下不需要fzero或polyval。 – Andy 2014-09-28 14:51:22

回答

0

我不知道你爲什麼不使用提供給您剛纔的問題Finding where plots may cross with octave/matlab

但這裏是這裏發生了什麼(從DOC)的解決方案:

如果X0是單個標量,那麼探測多個附近和遠處的值是 ,試圖獲得有效包圍。如果這不是 成功,則該功能失敗。

所以發生的是你最初的猜測3離解決方案太遠了。嘗試改爲:

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

但是,我不知道你正在嘗試做的擬合第一多項式對您的數據,它沒有任何意義,我...

+0

下面推薦的十字路口功能對於數組高達8000個值是非常好的,但是如果我有一個數值爲100000或更多的數組,我會耗盡內存(並且我有16g內存),這很可能是由於repmat命令與交叉口功能。 所以現在我試圖: 1)雖然循環表示行 數組中的每一行2)將交叉點值存儲在一個數組中。 這應該解決使用大型數組的內存不足問題 – 2014-09-26 15:05:59