2012-10-12 71 views
1

我需要取一個矢量子集的最大值,然後在矢量中移動。例如列向量對矢量子集進行MATLAB計算,然後移位,然後重複

a=[1;2;3;4;5;6;7] 

我怎麼能採取max(a(1:3))max(a(2:4)),... max(a(5:end))並放在另一個向量所有的輸出?我可以很容易地用for循環來做到這一點,但我正在尋找一種在MATLAB中使用矩陣運算並且最好在單行代碼中這樣做的優雅方式(儘管我意識到MATLAB中的矩陣運算可能會這樣做使用for循環來實現)。

謝謝! (你的情況RESP 1和3)

回答

2

假設你的移位和窗口長度是恆定的,則可以使用nlfilter到上的矢量限定的一般滑動窗口操作:

a = [1:7]; 

fun = @(x) max(x(:)); 
b = nlfilter(a, [1 4], fun); 
+1

這的確正是OP想要的東西,但是,這不是基本的Matlab的 - 使用'nlfilter',你所需要的圖像處理工具箱。 –

+0

感謝您的幫助。基於nlfilter的文獻,爲什麼我們使用[1 4]作爲塊而不是[1 3]?看來[1 3]包括在內更合適。 –

1

對於示例您提供:

b = max([a(1:end-2) a(2:end-1) a(3:end)], [], 2) 

我覺得還有一個更優雅,更普遍的accumarray的解決方案,雖然我沒有時間,現在變出一起來:)

1

這是我的嘗試。首先,定義'窗口'長度(在你的案例中爲3)。接下來,使用bsxfun爲每個窗口的a向量創建索引。最後一步是一個簡單max函數調用:

​​

它是通用的,即你可以改變窗口大小。

這是基本的matlab,應該比nlfilter更快,雖然我現在無法驗證它。

編輯這裏是上述bsxfun解決方案的簡要性能比較和建議im2col

a = rand(10^7,1); 

tic; 
idx = bsxfun(@plus, [0:2]', 1:numel(a)-2); 
m1 = max(a(idx)); 
toc 

tic; 
m2 = max(im2col(a,[3 1],'sliding')); 
toc; 

isequal(m1, m2) 

Elapsed time is 0.839869 seconds. 
Elapsed time is 1.797665 seconds. 

ans = 

1 

當然作品bsxfun,比快一倍多。

-1

感謝您的幫助。這給了我一些想法,特別是使用nlfitler的建議。事實證明,nlfitler調用im2col並採取這最大值將爲我工作。特別是由於提供的樣本向量是包含隨機變量的實數向量的簡化,所以bsxfun選項存在不起作用。

MAX(im2col(A,[3 1], '滑動'))

+0

爲什麼'bsxfun'不能工作?它不關心你存儲在向量中的值。它對矢量的索引進行操作,它們總是整數。你甚至試圖運行它,看看它做了什麼?特別是,你看過'a(idx)'並將其與'im2col'的輸出進行比較嗎? – angainor

0

如果具有信號處理工具箱,你可以使用buffer功能。 它需要一個向量並生成一個矩陣,其中每列包含滑動窗口內的向量值。

你的情況:

>> a = (1:7)'; 
>> buffer(a,3,2,'nodelay') 

ans = 

    1  2  3  4  5 
    2  3  4  5  6 
    3  4  5  6  7 

然後,只是採用MATLAB的max函數來計算最大每一列的。 總之,用一個單一的代碼行,

>> max(buffer(a,3,2,'nodelay')) 

ans = 

    3  4  5  6  7 
相關問題