2016-03-16 62 views
-1

我有一個矩陣,它是256X192X80。我想正常化所有切片(80代表切片),而不使用for循環。 我與for做的方法是如下:(im_dom_raw是我們的矩陣)根據MATLAB中的切片規範化3D圖像

normalized_raw = zeros(size(im_dom_raw)); 
for a=1:80 
    slice_raw = im_dom_raw(:,:,a); 
    slice_raw = slice_raw-min(slice_raw(:)); 
    slice_raw = slice_raw/(max(slice_raw(:))); 
    normalized_raw(:,:,a) = slice_raw; 
end 
+0

這裏沒有問題。請編輯以提出具體問題。它可能不相關,但如果'slice_raw'恰好全爲零,則會得到'0/0',即'NaN'。 – horchler

回答

3

下面的代碼實現您的標準化方法沒有使用循環。它基於bsxfun

% Shift all values to the positive side 
slices_raw = bsxfun(@minus,im_dom_raw,min(min(im_dom_raw))); 

% Normalize all values with respect to the slice maximum (With input from @Daniel) 
normalized_raw2 = bsxfun(@mrdivide,slices_raw,max(max(slices_raw))); 

% A slightly faster approach would be 
%normalized_raw2 = bsxfun(@times,slices_raw,max(max(slices_raw)).^-1); 
% ... but it will differ with your approach due to numerical approximation 

% Comparison to your previous loop based implementation 
sum(abs(normalized_raw(:)-normalized_raw2(:))) 

的代碼輸出

ANS最後一行=

哪個(感謝@Daniel)意味着這兩種方法得到確切相同的結果。

+1

因爲使用了不同的操作,所以你會得到很小的區別:'normalized_raw3 = bsxfun(@ mrdivide,slices_raw,max(max(slices_raw)));'結果是一樣的,但是你的版本可能稍微快一點。 – Daniel

+0

謝謝@Daniel。會相應更新。 – pysolver