2014-03-19 214 views
3

我試圖建立一些代碼,以提取一個矩陣的某些元件,並且只保留這些值在另一矩陣的原始順序的順序,它們被提取的。例如:如果我有一個隨機的1X20矩陣,但只希望每個第4,5個元素以4和5開始,我希望它構造一個新的矩陣(1x8),只包含4,5,9,10 ,14,15,19,20Matlab的:提取的矩陣的第N個元素,同時保持矩陣

我至今是:

r = rand(1,20); 
n = 5; 
a = r(4 : n : end); 
b = r(5 : n : end); 

因此,而不是兩個獨立的矩陣,而不是我想要一個矩陣在其原來的時間順序(同樣,1×8矩陣由大約4,5,9,10,14,15,19,20的元素組成)。從本質上講,我希望能夠爲任意數量的值做到這一點,同時仍保持原來的順序的元素是in。

回答

2

開始與45然後指數創建所有索引到索引r分開對它們進行排序,以保持元素的順序,因爲它本來是r

所以,這應該工作 -

ab = r(sort([4:n:numel(r) 5:n:numel(r)])) 
+0

這樣做,而且非常簡單!我應該早點尋找排序功能。謝謝! – Adamosphere

+0

呀你的情況下,這是簡單而有效的,我認爲。 – Divakar

2

爲初始值的變量數A更通用的解決方案:

% example 
A = 1:20; 

% starting values and number of values to skip 
a = [4,5]; 
n = 5; 

% index vector 
idx = bsxfun(@plus,a',(0:numel(A)/n-1)*n) 

% indexing 
result = A(idx(:)) 

回報:

idx(:)' = 4  5  9 10 14 15 19 20 

另一個例子:

A = 1:40; 
a = [3,4,7]; 
n = 10; 
idx = bsxfun(@plus,a',(0:numel(A)/n-1)*n) 

回報:

idx(:)' = 3  4  7 13 14 17 23 24 27 33 34 37 
+1

謝謝!我特別喜歡第二個例子,它是多麼的多才多藝! – Adamosphere

1

可以使用ndgrid做到這一點(這個想法是從kron的代碼,這確實或多或少你想要什麼,但與產品,而不是資金採取):

a = [4 5]; %// initial values 
M = 20; %// maximum value 
s = 5; %// step 

[ii jj] = ndgrid(a,0:s:M-max(a)); 
ind = (ii(:)+jj(:)).'; 
+1

在很多答案中,我從來沒有達到'。'的目的,而不是''''。你爲什麼做這個? – thewaywewalk

+0

那天正好很多人:-)'''是_conjugate_轉,而'.''是標準的轉置。當我想只轉我用'.''(即使參數並不複雜,因此它不會有所作爲綴合它們)。從概念上講,我更加清楚的是不要引入不需要的結合。開發使用'''來轉置的習慣[可能導致問題](http://stackoverflow.com/questions/22258444/transfer-function-in-time-domain) –

+0

很好的知道,雖然這個操作符是絕對誤導在我眼中,因爲它意味着用於元素明智的複共軛轉置。總之,謝謝;) – thewaywewalk