2016-01-23 20 views
1

執行某些功能我有此代碼訪問多維數組的層並且在每個層

A = unidrnd(2,100,30)-1; 
B = reshape(A, 100, 3, 10); 

B是一個多維陣列的100x3矩陣10層。現在,我想執行這個代碼,

C = length(nonzeros(all(B,2)))/100; 

其中的代碼的右側的功能是假設產生對應於10層的結果10個值,但我得到的是一個單一的值。代碼的右側檢查有多少行都是1。它需要的行數是所有的1和由100將它以獲得全爲1的行的數量的分數

如何使用上面顯示的單行代碼獲得3D矩陣的每個100 x 3圖層的結果,以便我不必使用循環?結果Ç必須是結果的陣列按預期方式。

+0

請仔細閱讀標籤說明[代碼審查(http://stackoverflow.com/questions/tagged/code-review),上面清清楚楚地寫着**不要使用該標籤索要代碼審查你的代碼**,你必須使用http://codereview.stackexchange.com。如果你不想要審查,但有一個具體問題(我認爲你應該這樣做),請刪除該標記。 – Adriaan

+0

@Adriaan感謝您的信息。我已經刪除了該標籤。 – nashynash

+0

未來,請實際閱讀您考慮使用的標籤的標籤說明。它會保存你幾個封閉式問題 – Adriaan

回答

2

你開始進行的順利。 all(B,2)是不錯的,它可以讓你的100x1x10矩陣這1,其中相應的行全部爲1和0否則。

nonzeros但是,只是列出了整個矩陣的所有非零元素,在您的情況下,它是一串1,完全忽略數組的維數。您可以使用nonzeros(A(:))nonzeros(A)相同的結果。
[注:nnz(A)都可以獲得相同的結果length(nonzeros(A)),但是這不是我們想要做反正]

由於您的矩陣是二進制(的all輸出是一個邏輯陣列),我們可以算通過求和矩陣元素來計算非零元素的數量。而sum給了我們一個維度參數就像all,所以我們只是總結了all給我們。

C = sum(all(B,2),1)/100; 

這給你一個1x1x10陣列百分比。如果你想這只是一個正常的矢量,你可以使用squeeze

C = squeeze(sum(all(B,2),1)/100); 
+0

我試着比較使用你的代碼和我的代碼的第一層的價值,但他們似乎並沒有產生相同的結果。 **我的代碼** 'C =長度(非零元素(所有(B(:,:,1),2)))/ 100;' ANS:0.0900 **您的代碼:** 'd = sum(any(B(:,:1),2),1)/ 100;' ans:0.8600 – nashynash

+0

只有在您建議的代碼中用'all'替換函數'any'時纔有效 – nashynash

+0

@ nashynash你是對的。我的大腦在那個假期裏休假了。雖然我在描述中說得很對,但是!我會編輯代碼:) – beaker