2015-05-18 46 views
0
A = [0,0,1,0,1,0,1,0,0,0; 
    0,0,0,0,1,0,1,0,0,0; 
    0,0,1,0,1,0,1,0,0,0]; 

B = [2,5; 
    1,6; 
    3,10]; 

期望輸出單元陣列中執行用於不同的列:條件每一行

C = [1,1,1,1;   %// 2-3-4, 3-4-5, 4-5, 5 
    0,0,1,1,1,0;  %// 1-2-3, 2-3-4, 3-4-5, 4-5-6, 5-6, 6 
    1,1,1,1,1,0,0,0]; %// 3-4-5, 4-5-6, 5-6-7, 7-8-9, 8-9-10, 9-10, 10 

矩陣B包括哪些列應被用於執行矩陣A.例如條件下,B的第一行是2和5;所以矩陣A的第2列第5列之間的元素應該用來執行條件。 B的第二行是1和6;因此應使用第1列第6列中的元素來執行該條件。等等...

條件:如果連續3個元素的總和大於或等於1,則寫入1到矩陣C;否則寫爲0.例如,A包括0,1,0作爲三個連續元素(和爲0 + 1 + 0 = 1),所以將1寫入矩陣C.另一個例子,第二行中的前三個元素爲0 ,0,0(sum爲0),所以寫0到矩陣C.等等...

「有時它可以被認爲只有1或2個連續的元素。

例如,A的第一行的條件執行以第5列結束,所以應該只考慮第5列的值;這是1。所以1被寫入到矩陣C.

解釋C的第一行:

1,由於A(1 2,3,4-元件(總和,:) )> = 1

1中,由於> =(的A(1 3,4,5元素,:)的總和)1

因爲最大限制是500,只有2個連續元素都在這裏採取
1,因爲(A(1,:))單獨的4,5個元素的總和> = 1

因爲最大限制是500,只有1連續元件在這裏是
1中,由於單獨的A(1第五元素的(總和,:))> = 1

沒有for循環中,僅與矩陣操作,我該怎麼做這個複雜的任務?或任何詭計?

+0

「(總和爲0 + 1 + 0 = 1),所以寫1到矩陣C「,爲什麼?你說,總和應該大於1.我想你的意思是*大於或等於1 *而不是「大於1」 –

+0

你是如何獲得矩陣「C」的?另外,你如何定義連續的元素,按行,按列?例如,在第一行第2列到第5列中,矩陣C中得到[1; 1]。如何得到接下來的兩個1? –

+0

@ ParagS.Chandakkar是的,它應該大於等於1. – oarar

回答

1

使用mat2cellcellfunim2colany

subMatLen = 3; 

%// Converting both A & B matrix to Cell Arrays to perform operations Row-wise 
AC = mat2cell(A,ones(1,size(A,1)),size(A,2)); 
BC = mat2cell(B,ones(1,size(B,1)),size(B,2)); 

%// Getting only the columns of each rows within the limits specified by Matrix B 
%// Also appended with zeros for my own convenience as it wont affect the 'summing' process 
out = cellfun(@(x,y) [x(y(1):y(2)),zeros(1,subMatLen-1)],AC, BC, 'uni', 0); 

%// Finally taking each 1x3 sliding sub-matrix and returning 1 if `any` of it is non-zero 
%// which is equivalent to summing and checking whether they are >= 1 
out = cellfun(@(x) any(im2col(x, [1,subMatLen], 'sliding')), out, 'uni', 0); 

您的樣品輸入:

A = [0,0,1,0,1,0,1,0,0,0; 
    0,0,0,0,1,0,1,0,0,0; 
    0,0,1,0,1,0,1,0,0,0]; 

B = [2,5; 
    1,6; 
    3,10]; 

輸出:

>> celldisp(out) 

out{1} = 

1  1  1  1 


out{2} = 

0  0  1  1  1  0 


out{3} = 

1  1  1  1  1  0  0  0 

如果你希望他們作爲一個單一的行或列矩陣,你可以添加這對代碼的底部:

out = cat(2,out{:}) 

out = (cat(2,out{:})).' 
+1

當我寫這個問題時,我沒想到有人會回答。謝謝@Santhan。有用。我怎樣才能使連續的元素數作爲變量(在問題中是3)。在我的代碼中,當我用6更改3時,在代碼的最後一行,結果矩陣不正確。 – oarar

+0

@oarar,我很高興它有幫助。編輯我的代碼..你不必編輯代碼。只需更改頂部的「subMatLen」。它應該工作:) –

+1

它的工作。再次感謝。 – oarar