2014-04-01 95 views
0

我已經想出了一種適用於我的目的的方法,但是我希望將解決方案推廣到更多數量的試驗,而不必爲試驗中的每次增加硬編碼新的if語句。現在審判= 4,如果我想試驗= 5我需要寫一個新的if語句。有沒有辦法讓這個更高效(Matlab)?

if new_A == 1:trials; 
    outer_matrices{:,1} = A; 
end 
if new_A == trials+1:trials*2; 
    outer_matrices{:,2} = A; 
end 
if new_A == (trials*2)+1:trials*3; 
    outer_matrices{:,3} = A; 
end 
if new_A == (trials*3)+1:trials*4; 
    outer_matrices{:,4} = A; 
end 

你看到的模式(與試驗= 5,我需要通過4和5分別繁殖,然後切換到outer_matrices {:5})

我敢肯定有一個相當簡單的解決方案/我只是沒有想到的結構。提前致謝!

+0

剛纔檢查和Schorsch的做工作作爲new_A指的是一個數x在X:X +試驗。謝謝大家的幫助! – user3486132

+0

把我的評論變成了一個答案,如果你想接受一個 – Schorsch

回答

0

嘗試此(沒有循環或條件的方法) -

N = 5;%%// Number of cases 
ind = find(all(bsxfun(@eq,reshape(1:trials*N,trials,[]),new_A'),1)) 
outer_matrices{:,ind} = A; 
0

我是否new_Atrials數個元素的向量。由於(trials*n)+1:trials*(n+1)的形式[trials*n+1, trials*n+2, ... ]的載體,你可以這樣做:

if ~mod(new_A(1)-1,trials) && all(diff(new_A) == 1) 
    outerMatrices{(trials+new_A(1)-1)/trials} = A; 
end 

它所做的是:

~mod(new_A(1)-1,trials)使用modulus操作,以檢查是否在new_A的第一個元素是試驗整除。如果是,則mod將返回0mod前面的~表示「不」,因此如果mod返回零,則這將評估爲「〜0 == 1」。

all(diff(new_A)==1)檢查new_A中的所有元素是否恰好相隔一個元素。

0

基本for -loop途徑反映的問題的代碼是:

N=5; 
for ii=1:N 
    if new_A == trials*(ii-1)+1:trials*ii 
     outer_matrices{:,ii} = A; 
    end 
end 
相關問題