2015-05-18 63 views
0

我有多個軌跡(一系列2D點),我想繪製在圖像上。例如,在下面的例子中,我有10個曲目,每個曲目都有自己的3個點。我遍歷所有曲目並分別繪製它們中的每一個。請注意,我所有的曲目都有相同的點數。繪製圖像上的多個軌跡(二維點的序列)

這工作正常,但它很慢。問題是,當我有大量的軌道(當NUM_TRACKS大到1000秒)時,循環遍歷每個軌跡並分別繪製它們需要很長的時間。有沒有辦法使用單個plot命令顯示所有曲目?

NUM_PNTS = 3; 
NUM_TRACKS = 10; 
pnts = 400 * rand(NUM_PNTS, 2, NUM_TRACKS); 

imshow('peppers.png'); 
hold on; 
for idx = 1:NUM_TRACKS 
    curr_pnts = pnts(:,:,idx); 
    plot(curr_pnts(:,1), curr_pnts(:,2), '.-', 'Color',[1,1,1], 'LineWidth',2); 
end 
hold off; 
+0

「太長」是什麼意思?在上面的例子中,即使設置了'NUM_TRACKS = 5000',繪圖在3.4秒內完成。 (Matlab 14b) –

+0

是的。我正在構建一個交互式圖形用戶界面,所以大於1秒的任何內容都太長。我只是想知道你是否可以在一個繪圖命令中做到這一點 - 因爲線條樣式/標記樣式是相同的。 – ahmadh

+0

也許我找到了一個解決方案來加速軌道的情節,我已經更新了答案和代碼。 –

回答

1

更新答案

最耗時的代碼中的操作是加載圖像;嘗試加入tic & toc(請參閱下面的代碼)。

一個可能的解決方案可能是將原始pnts矩陣重塑爲一個(N x M),它將一組軌跡點放在一起。在這樣做的過程中,我們還在軌道的每一組點之間添加一行NaN。

結果矩陣的樣子:

108.3056 226.8722 
    58.8603 322.0754 
    294.0138 161.5577 
     NaN  NaN 
    3.0982 155.5985 
    86.1691 190.2200 
    390.4753 116.3666 
     NaN  NaN 
    288.5506 352.9553 
    192.4952 158.6255 
    31.8394 256.8299 
     NaN  NaN 
    396.1230 149.1251 
    278.0844 110.9723 
    274.6267 13.7672 
     NaN  NaN 

現在,我們可以調用plot要求直接繪製矩陣

plot(m(:,1),m(:,2), '.-', 'Color',[0,0,0], 'LineWidth',2); 

由於NaN的插入,該功能將繪製儘可能多的「段「作爲曲目的數量。

這應該加快情節。

我更新了代碼以生成新的(N×M)矩陣。 (肯定有做它一個更智能,更高效的方式)

更新代碼

NUM_PNTS = 3; 
NUM_TRACKS = 5000; 
pnts = 400 * rand(NUM_PNTS, 2, NUM_TRACKS); 

imshow('peppers.png'); 

tic 
m=NaN(NUM_PNTS*NUM_TRACKS+NUM_TRACKS,2); 
for i=1:NUM_TRACKS 
    m(i+(NUM_PNTS)*(i-1):i+(NUM_PNTS)*(i-1)+NUM_PNTS,:)=[pnts(:,:,i);NaN(1, 2)]; 
end 
plot(m(:,1),m(:,2), '.-', 'Color',[0,0,0], 'LineWidth',2); 
hold off; 
toc 

希望這有助於。

+0

是的,在我閱讀圖像的例子中,我花了一些時間加載。當NUM_TRACKS大於1000s時,我更關心'plot'命令在循環中佔用的時間量。例如,當NUM_TRACKS = 5000時,我的機器至少需要4秒才能越過'plot'循環。關於如何編寫單個繪圖命令而不是循環遍歷每個軌道的任何想法? – ahmadh

+0

哦哇,我很喜歡這個NaN解決方案:)非常感謝@il_raffa – ahmadh