2014-07-18 83 views
2

爲簡單起見,讓我們堅持使用this official Matlab example在Matlab中清空結構數組的所有字段

我運行下面的代碼,並創建一個有三個字段的結構。

patient.name = 'John Doe'; 
patient.billing = 127.00; 
patient.test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205]; 

然後,爲了創建一個結構數組,我只需要執行以下操作。

patient(2).name = 'Ann Lane'; 
patient(2).billing = 28.50; 
patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169]; 

在這一點上我有,這顯然是this picture代表的結構數組: enter image description here

問題來了:我怎樣才能清空結構patient(2)的所有領域?

理想情況下(原諒濫用符號)我想要做一些像patient(2).* = {}

調用字段是不是一個選項,因爲在我的實際代碼中,我有很多字段,我也不能將結構轉換爲單元格。

提前致謝!

+1

@Ander Biguri謝謝你這麼多的圖像添加到這個問題,我沒有在我貼:) – lucam

回答

3

如果此操作是頻繁的,一個好的想法是準備一個EMPTY_PATIENT

EMPTY_PATIENT = struct(... 
    'name', {},   ... 
    'billing', {},  ... 
    'test', {}   ... 
); 

然後用簡單的賦值(這是非常快的)空位置:

patient(2) = EMPTY_PATIENT; 
+0

確定這是最安全和最快的方式,使用foo空結構!謝謝CST :) – lucam

+2

作爲一般性評論:如果只有一個級別,並且有很多字段需要填充,則可以輸入一個字段名,MATLAB將填充其餘字段。例如:'patient(end + 1).name = []; empty_patient =患者(結束);耐心(結束)= [];'保存一些打字 – excaza

0
patient(2) = []; 

可能是你在找什麼。這將從結構中消除該元素。

+0

謝謝您的回答時必要的聲譽,但我確實需要保持元素因爲數組的大小在我的代碼中扮演了角色。我明確需要清空它的字段,而不是刪除它。 – lucam

1

我敢肯定有一個聰明的方法來做到這一點沒有循環,但這工作正常。

fieldstoclear = fieldnames(patient(2)); 

for ii = 1:length(fieldstoclear) 
    patient(2).(fieldstoclear{ii}) = []; 
end 

編輯:忘了structfun

patient(2) = structfun(@(x) [], patient(2), 'UniformOutput',false) 

注意:這兩種方法都將保持嵌套結構。

+0

謝謝excaza,這是正確的方向。無論如何,嵌套結構在這種情況下很重要,所以我不能真正接受這個答案!但是,這又是一個進步,謝謝! – lucam

0

這應該是任何領域的通用解決方案。

fields=fieldnames(patient); 
patient(2)=cell2struct(cell(length(fields), 1), fields);