2014-09-01 156 views
0

我是一名Matlab初學者,至今未能找到答案。您的幫助一定會非常感激。在MATLAB中使用部分變量名創建一個循環

我有70個矩陣(100x100),命名爲SUBJ_1,SUBJ_2等。我想創建一個循環,以便爲每個矩陣計算一些指標(即最大值和最小值),並將輸出保存爲70x2結果矩陣(其中每行將對應於連續命名的SUBJ_矩陣)。

我在這兩個階段都掙扎 - 如何在'for'循環中使用各個變量的名稱以及如何正確地將各個輸出保存在組合數組中。

非常感謝,一切順利!

+0

[見相關答案】(http://stackoverflow.com/a/25378067/ 3372061)。 'eval(sprintf(...))'是你想要的代碼/解決方法/破解,但是請注意開頭的警告(類似於[Daniel](http://stackoverflow.com/a/25602011/) 3372061)和[Jonas](http://stackoverflow.com/a/25601997/3372061)中提到)。 – 2014-09-01 09:06:14

回答

1

至於如何在「for」循環,這裏舉了一個例子使用單獨的變量的名稱:

SUBJ = []; 
for idx = 1:70 
    term = eval(['SUBJ_',num2str(idx)]); 
    SUBJ = [SUBJ; max(max(term)),min(min(term))]; 
end 
+0

這就是實際要求的@rochned,但正如其他評論中提到的那樣,它並不是真正推薦的,例如,出於速度原因。每當你試圖使用'eval',有可能是一種更有效的方式去做事情...... – 2014-09-01 18:44:18

+0

是的,我承認,特別是當你有大量數據需要處理時。 – Highman 2014-09-02 01:41:04

+0

謝謝,@Highman - 這正是我需要的!對於當前數據集(和其他腳本),這似乎工作得很好。非常感謝其他人的建議和解釋! – rochned 2014-09-02 10:35:11

3

儘管這在Matlab中原則上是可行的,但我不會推薦它:太慢而且實施起來很麻煩。

你可以改爲使用一個3-D矩陣(100x100x70)SUBJ,它將包含所有的SUBJ_1等在一個矩陣。這可以讓你用一行代碼來計算最小/最大值等。 MATLAB會照顧循環的內部:

OUTPUT(:,1) = min(min(SUBJ,[],1)[],2); 
OUTPUT(:,2) = max(max(SUBJ,[],1)[],2); 

這樣,OUTPUT(1,1)包含min(min(SUBJ(:,:,1)))等等...

+0

大矩陣比單元陣列更好,但代碼不正確。 'ALLMINS = min(min(SUBJ,[],1)[],2);'會產生正確的結果。 – Daniel 2014-09-01 08:48:19

+0

@丹尼爾,謝謝你 - 沒有MATLAB打開和太久,因爲我用了很多: -/ – 2014-09-01 08:50:14

+0

你好!非常感謝您的建議。雖然這對於這個特定的(第一個)任務來說是實用的,但在我的數據處理的後期階段,我仍然需要以某種方式通過對應於各個主題的數組創建循環。我將需要運行一些以前準備好的腳本,這些腳本的數組需要保持其原始大小。因此,它是否仍然有可能通過基於主題名稱的單個數組創建一個循環?謝謝! – rochned 2014-09-01 08:51:55

4

不要使用這樣的變量名,創建一個名爲SUBJ一個大單元陣列,把每個矩陣在裏面。

r=zeros(numel(SUBJ),2) 
for idx=1:numel(SUBJ) 
    r(idx,1)=min(min(SUBJ{idx})) 
    r(idx,2)=max(max(SUBJ{idx})) 
end 

minmax被稱爲兩次,因爲第一次調用創建的行,列中第二個電話中最大。

+0

包含矩陣的單元陣列也可以工作,但我認爲它比我在解決方案中給出的3d矩陣慢。儘管所有70個矩陣不必是相同的大小,但它具有優勢。 – 2014-09-01 08:51:20