2014-07-19 50 views
-2

我怎樣才能得到一個新的變量(輸出)只有你觀察到的值,這些年份(列)的值變化的行。 (例如:第1行)? (不考慮第一列) 例如何獲得新的變量,如果值的變化沿着在Matlab的列

輸入:

Title x '97 '99 '00 '01 '02 
%row1 13 189 189 39 39 39 
     16 183 183 183 183 183 
     18 76 76 76 28 28 
     22 [] [] 123 123 123 
     25 12 12 12 [] [] 

輸出:

x '97 '99 '00 '01 '02 
    13 189 189 39 39 39 
    18 76 76 76 28 28 
+2

哪些空白項?你的變量是作爲單元格數組存儲的嗎? – Shai

+1

我認爲OP希望那些行如果你忽略空白條目,任何顯示你至少有一個變化的行(即'any(diff(row,:)〜= 0)),那麼這是一行**不被視爲**)。 – rayryeng

+0

@Shai我的變量存儲爲單元數組是的。我的空白條目是我沒有相應的值的條目。他們也可以是'0'或'NaN'。導致空白條目的代碼如下:'B(arrayfun(@(x)isempty(strfind(idx(x,:),[1 1])),1:size(idx,1)),: )= [];' – user3557054

回答

2

我會假設你的矩陣是一個二維單元陣列。如您所說,我們會忽略第一列。基本步驟如下:

  1. 創建一個新的單元陣列,其行數與原始單元陣列數一樣多。
  2. 對於原始單元陣列的每一行,將每一行轉換爲一個向量,並將其作爲新元胞陣列中的一個元素。每行的空白條目將被忽略。我們無法做到矢量化,因爲每一行都可能不均勻,因此需要循環。
  3. 對於每一行,請使用diff來查找每行中相鄰元素之間的差異。如果任何的條目都非零,那麼這是我們需要的一行。此步驟中的輸出將是與列中沒有變化的那些行匹配的行的列表
  4. 使用步驟#3中的索引並將原始單元格數組分組。

事不宜遲:通過這個代碼

%// Sample data 
A = {13 189 189 39 39 39 
    16 183 183 183 183 183 
    18 76 76 76 28 28 
    22 [] [] 123 123 123 
    25 12 12 12 [] []}; 

%// Create new cell array that contains 
%// the rows of your cell array converted into a vector 
B = cell(size(A,1),1); 

%// For each row, extract everything but the first column 
%// and convert to a vector 
for ind = 1 : size(A,1) 
    B{ind} = cell2mat(A(ind,2:end)); 
end 

%// Find those rows where we 
%// find at least one transition 
C = cellfun(@(x) any(diff(x) ~= 0), B); 

%// Subset your original cell matrix 
%// to just have these rows 
finalMat = A(C,:) 

讓我們一步步慢慢來。我根據你的文章創建你的原始單元格數組。下一行代碼創建一個空白單元格數組,其中我們有與原始矩陣中的行數一樣多的元素。下一行代碼有一個for循環,遍歷原始矩陣的每一行。對於每一行,忽略第一列並抓住所有其他列。這將提取每行的所有單元格。我們希望將其轉換爲元素的法線向量,這就是爲什麼在我們爲每一行提取單元格後使用cell2mat。這個矢量然後被放置在我們之前創建的空白單元格陣列的相應位置。

我們必須這樣做,因爲每一行都可能有空元素,所以如果我們在整個2D單元矩陣上做cell2mat,我們會得到一個尺寸不一致的錯誤。所有的行必須具有相同的列數。然後,我們使用cellfun來遍歷空白(現在填充的)單元陣列中的所有單元。每個單元格元素將包含我們查看的原始單元格矩陣的每一行,並且所有空元素都將被忽略。對於每個單元元素/行向量,我們使用diff來獲取數組中元素對的差異。 diff作品像這樣:在索引i您的陣列x中的值,在索引i輸出爲陣列y是:

y_i = x_{i+1} - x_i 

因此,如果行向量具有所有相同的元件,則此應生成一個完整的零數組。如果至少有一個變化,那麼這是我們需要提取的一行,這就是我們做any(diff(x) ~= 0)的原因。如果行向量中至少有一個變化,我們輸出true1。如果所有元素都相同,我們輸出false0。那麼cellfun的輸出將告訴我們是否一個特定的行是我們正在尋找或不是。然後,我們使用該輸出來對原始單元格數組進行子集化,以篩選出在所有列上都有一些轉換的那些行。


輸入:

A = 

[13] [189] [189] [ 39] [ 39] [ 39] 
[16] [183] [183] [183] [183] [183] 
[18] [ 76] [ 76] [ 76] [ 28] [ 28] 
[22]  []  [] [123] [123] [123] 
[25] [ 12] [ 12] [ 12]  []  [] 

你的輸出存儲在finalMat,它看起來像:

finalMat = 

[13] [189] [189] [39] [39] [39] 
[18] [ 76] [ 76] [76] [28] [28] 
+0

哇。我剛剛看到你的'描述性'編輯答案。非常感謝你。我會仔細閱讀,但我相信它會證明對我學習真的很有用。謝謝。 – user3557054

相關問題