2017-08-24 93 views
0

我想知道3維空間中的零點個數rowcolumn。問題是我每次都得到不同長度的輸出向量(例如行),因此會發生尺寸錯誤。 我嘗試:構造不同長度的矢量

a (:,:,1)= [1 2 0; 2 0 1; 0 0 2] 
a (:,:,2) = [0 2 8; 2 1 0; 0 0 0] 

for i = 1 : 2 
[row(:,i) colum(:,i)] = find(a(:,:,i)==0); 
end 
+0

使用電池來存儲值被發現。 – OmG

回答

1

可以使用線性索引:

a (:,:,1) = [1 2 0; 2 0 1; 0 0 2]; 
a (:,:,2) = [0 2 8; 2 1 0; 0 0 0]; 

% Answer in linear indexing 
idx = find(a == 0); 

% Transforms linear indexing in rows-columns-3rd dimension 
[rows , cols , third] = ind2sub(size(a) ,idx) 

更多的話題可以Matlab's help

+0

它運作良好。儘管製作單元格會很有用。 –

+0

我不確定你的意思是「製造細胞」。在單個單元格中創建'rows','cols'和'third'?在三個單獨的單元陣列?單個矩陣的單元格? – Zep

0

讓我們假設你的矩陣的格式爲n乘M-通過-P。 在你的情況

N = 3; 
M = 3; 
P = 2; 

這意味着行和coloms的最大長度從搜索(如果所有項目均爲零)是N*M=9

所以,一個可能的解決方案是

%alloc output 
row=zeros(size(a,1)*size(a,2),size(a,3)); 
colum=row; 
%loop over third dimension 
n=size(a,3); 
for i = 1 : n 
    [row_t colum_t] = find(a(:,:,i)==0); 
    %copy your current result depending on it's length 
    row(1:length(row_t),i)=row_t; 
    colum(1:length(colum_t),i)=colum_t; 
end 

但是,如果將結果傳遞到下一個函數/腳本,則必須記住對非零元素進行操作。

我會去爲Zep矢量化解決方案。至於更大的矩陣a它更有記憶效率,我相信它必須更快。