我會假設你的矩陣是一個二維單元陣列。如您所說,我們會忽略第一列。基本步驟如下:
- 創建一個新的單元陣列,其行數與原始單元陣列數一樣多。
- 對於原始單元陣列的每一行,將每一行轉換爲一個向量,並將其作爲新元胞陣列中的一個元素。每行的空白條目將被忽略。我們無法做到矢量化,因爲每一行都可能不均勻,因此需要循環。
- 對於每一行,請使用
diff
來查找每行中相鄰元素之間的差異。如果任何的條目都非零,那麼這是我們需要的一行。此步驟中的輸出將是與列中沒有變化的那些行匹配的行的列表
- 使用步驟#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)
的原因。如果行向量中至少有一個變化,我們輸出true
或1
。如果所有元素都相同,我們輸出false
或0
。那麼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]
哪些空白項?你的變量是作爲單元格數組存儲的嗎? – Shai
我認爲OP希望那些行如果你忽略空白條目,任何顯示你至少有一個變化的行(即'any(diff(row,:)〜= 0)),那麼這是一行**不被視爲**)。 – rayryeng
@Shai我的變量存儲爲單元數組是的。我的空白條目是我沒有相應的值的條目。他們也可以是'0'或'NaN'。導致空白條目的代碼如下:'B(arrayfun(@(x)isempty(strfind(idx(x,:),[1 1])),1:size(idx,1)),: )= [];' – user3557054