2017-08-03 81 views
0

我試圖一次循環多個結構,提取感興趣的變量,並將它們組合成一個單元格數組。問題:所有變量都有相同的名稱。我有一個工作的僞代碼 - 這裏是:如何遍歷多個結構並執行相同的操作[Matlab]

比方說,我加載我的工作區中的結構。現在我想遍歷每個結構,並從每個結構中提取時間和位置數據。

首先,我加載我的結構。像...

data_1 
data_2 
data_3 

然後,我創建適當大小的單元陣列。

time{i,:} = zeros(size(structures)); 
position{i,:} = zeros(size(structures)); 

最後,我遍歷我的結構來提取單元陣列並創建一個單一的數組。

for i = 1:size(structures) 
    time_i= data_i.numbers.time; 
    position_i= data_i.numbers.position; 
    time {i,:} = time_i; 
    position{i,:} = position_i; 
end 

我想結束一個單元格數組,包含一個單元格結構中所有變量的串聯。

您能否幫我將僞代碼/想法轉換爲腳本,或者指向可能有用的資源?

謝謝!

+0

這是怎麼代碼不給你你想要什麼?你遇到什麼錯誤? – Flynn

+0

謝謝,讓我澄清我的問題:我不知道如何實際循環「我」結構。換句話說,如何將「i」(一個變化的數值變量)定義爲結構名稱的一部分? – ahach

+0

好吧,使用eval應該可以工作。再加上我改爲一個字符串。 – Flynn

回答

1
... 
    eval(['time_',num2str(i),'= data_',num2str(i),'.numbers.time;']) 
    eval(['position_',num2str(i),'= data_',num2str(i),'.numbers.position;']) 
... 
+0

雖然這段代碼可能是一個解決方案,但它會[如果包含一個解釋](/ meta.stackexchange.com/q/114762)*如何*和*爲什麼*這將解決問題[大大改進]。請編輯您的答案以添加解釋,並指出適用的限制和假設。 – whrrgarbl

+0

會做什麼,我會總結我的代碼,併發布一下。 – ahach

1

你可能會好起來的加載數據內部的循環,並將其存儲到電池或結構,而不是試圖處理工作區中的迭代命名變量。在幾乎所有情況下,幾乎所有的情況下,幾乎都是由於MATLAB的JIT編譯器忽略了eval語句,所以你不會得到任何引擎的優化。語句也很難解析,調試和維護。

更強的方法的一個例子:

for ii = 1:nfiles 
    tmp = load(thefilenames{ii}); % Or use output of dir 

    trialstr = sprintf('trial_%u', ii); % Generate trial string 
    data.(trialstr).time = tmp.numbers.time; 
    data.(trialstr).position = tmp.numbers.position; 
end 

哪些給你留下的最後的數據結構:

data 
    trial_n 
    time 
    position 

它是通過以後更容易進行迭代。

+0

謝謝,我喜歡這個想法,這對我以後需要再次訪問這些變量以進一步計算時會有所幫助。 – ahach

1

我的興趣的人最終腳本:

for i = 1:4 %for 4 structures that I am looping through 
    eval(['time_',num2str(i),'= data_',num2str(i),'.numbers.time;']); 
    eval(['position_',num2str(i),'= data_',num2str(i),'.numbers.position;']); 
    %concatenate data into a single cell array here 
    time{i} = {eval(['time_',num2str(i)])}; 
    position{i} = {eval(['position_',num2str(i)])}; 
end 
相關問題