簡體   English   中英

Matlab:如何加快單元格數組中連續值的計數

[英]matlab: how to speed up the count of consecutive values in a cell array

我有137x19的單元格數組Location(1,4).loc,並且我想查找Location(1,4).loc中出現的水平連續值的次數。 我使用了以下代碼:

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

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

我想我會為此寫一個答案,因為我已經有一段時間沒有這樣做了。 首先將您的單元陣列轉換為矩陣,這將大大簡化以下步驟。 那么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.

因此,DiffA中的0表示A中的兩個連續數字相等,如果2個連續的0表示A中的三個連續數字相等。

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; 您現在可以通過執行以下操作來繼續此模式:

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

注意:該方法在評估2個連續樣本時,將[0,0,0]計數兩次,而在評估3個連續樣本時,將計數[0,0,0]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM