2016-03-30 21 views
0

我有137x19單元格陣列位置(1,4).loc,我想查找水平連續值出現在位置( 1,4)的.loc。我已使用此代碼:matlab:如何加快單元格陣列中連續值的計數

x=Location(1,4).loc; 
y={x(:,1),x(:,2)}; 
for ii=1:137 
cnt(ii,1)=sum(strcmp(x(:,1),y{1,1}{ii,1})&strcmp(x(:,2),y{1,2}{ii,1})); 
end 
y={x(:,1),x(:,2),x(:,3)}; 
for ii=1:137 
cnt(ii,2)=sum(strcmp(x(:,1),y{1,1}{ii,1})&strcmp(x(:,2),y{1,2}{ii,1})&strcmp(x(:,3),y{1,3}{ii,1})); 
end 
y={x(:,1),x(:,2),x(:,3),x(:,4)}; 
for ii=1:137 
cnt(ii,3)=sum(strcmp(x(:,1),y{1,1}{ii,1})&strcmp(x(:,2),y{1,2}{ii,1})&strcmp(x(:,3),y{1,3}{ii,1})&strcmp(x(:,4),y{1,4}{ii,1})); 
end 
y={x(:,1),x(:,2),x(:,3),x(:,4),x(:,5)}; 
for ii=1:137 
cnt(ii,4)=sum(strcmp(x(:,1),y{1,1}{ii,1})&strcmp(x(:,2),y{1,2}{ii,1})&strcmp(x(:,3),y{1,3}{ii,1})&strcmp(x(:,4),y{1,4}{ii,1})&strcmp(x(:,5),y{1,5}{ii,1})); 
end 

...繼續所有列。這段代碼運行並給了我正確的結果,但它不是自動的,而且速度很慢。你能給我一些想法來自動化和加速代碼嗎?

+0

如果它們是數字,爲什麼不先將它轉換爲矩陣?使用數字相等而不是字符串比較? – GameOfThrows

+0

是的,好主意!所以,我不必每次都重寫y = ....你能提出一個方法來加速代碼,避免18次總和(strcmp ....)嗎? – Ely

+0

也考慮'diff' – Amro

回答

0

我想我會寫一個答案,因爲我還沒有這麼做一段時間。 首先將您的單元陣列轉換爲矩陣,這將大大緩解以下步驟。然後diff是去

A = randi(5,[137,19]); 
DiffA = diff(A')'; %// Diff creates a matrix that is 136 by 19, where each consecutive value is subtracted by its previous value. 

所以在迪法0會在一個連續的代表2號的方式相同,連續2個0就意味着在一個連續的3個數字是相等的。

idx = DiffA==0; 
cnt(:,1) = sum(idx,2); 

要做到連續3張數數,你可以這樣做:

idx2 = abs(DiffA(:,1:end-1))+abs(DiffA(:,2:end)) == 0; 
cnt(:,2) = sum(idx2,2); 

或使用其它DIFF中,ABS是用來避免負號+正數也恰好給0;否則只有0 + 0會給你一個0;評估3時兩次評估2個consecutives此方法時,計數[0,0,0],一旦:您可以通過現在繼續這種模式:

idx3 = abs(DiffA(:,1:end-2))+abs(DiffA(:,2:end-1))+abs(DiffA(:,3:end)) == 0 
cnt(:,3) = sum(idx3,2); 

在循環格式:

absDiffA = abs(DiffA) 
for ii = 1:W 
    absDiffA = abs(absDiffA(:,1:end-1) + absDiffA(:,1+1:end)); 
    idx = (absDiffA == 0); 
    cnt(:,ii) = sum(idx,2); 
end 

注意consecutives。