2016-02-19 84 views
2

我要做到以下幾點:索引爲環MATLAB

創建與1:n所有可能的排列矩陣,例如

n=4; 
L=perms(1:n)'; 

我得到的輸出如預期的那樣 -by - 矩陣:

L = 

    Columns 1 through 13 

    4  4  4  4  4  4  3  3  3  3  3  3  
    3  3  2  2  1  1  4  4  2  2  1  1  
    2  1  3  1  2  3  2  1  4  1  2  4  
    1  2  1  3  3  2  1  2  1  4  4  2  

    Columns 14 through 24 

    2  2  2  2  2  1  1  1  1  1  1 
    3  4  4  1  1  3  3  2  2  4  4 
    1  3  1  4  3  2  4  3  4  2  3 
    4  1  3  3  4  4  2  4  3  3  2 

現在我想用這個矩陣的0索引循環:

使用的第一列,我要養活我的迴路的以下指標輸入:i=4j=321。然後對於i=3j=2,1。然後爲i=2j=1i=1是空

這可能只是做了這樣的第一列:

for u=4:-1:1 
    for v=u-1:-1:1 

,但不會對其他列工作,所以我需要做相同,但與矩陣L,類似的條目對於i=1列(它不工作MATLB):

u=L(1:4,1) 
v=L(u:L(4,1) , 1) %// where u corresponds to L(1,1) then L(2,1) then L(3,1) 

(所有列它看起來像:

for i=1:length(L) 
    for u=L(4*(i-1)+1:4*i) 
     for v=.. ? 

這不起作用,因爲MATLAB與增量1從取項的值,當我寫L(1,1):L(4,1)這並不意味着從一行返回條目四號線,而是所有的數字L(1,1)的值爲L(4,1)(此處爲空)。

任何想法?非常感謝你提前

+0

對於數組上的循環需要行向量,試着循環'L(1:4,1)。'(注意轉置)。 –

+0

@AndrasDeak是的,謝謝 – Sha

回答

3

我相信這樣的事情會解決你的問題。

for col = 1:size(L,2) 
    rowIdx = 1; 
    for j = [L(:,col)]' 
     for k = [L(rowIdx:end,col)]' 
     % Do your stuff here 

     end 
     rowIdx = rowIdx + 1; 
    end 
end 

請注意,我如何使用來自L的列的值直接作爲循環索引變量。在for循環語句中,您基本上可以編寫任何行向量,並且索引會獲取這些值。例如,

for i = [1, 7, 11, 14, 23] 
    disp(i); % prints 1,7,11,14,23 
end 

對於對象數組,單元陣列,基本上是任何單行矩陣都是如此。

+0

謝謝你完美的作品!我對於k = [L(rowIdx +:end,col)]'「而不是對於k = [L(rowIdx:end,col)]''(當n = 4時,對於每個迭代我得到6個矩陣x 24,這比10矩陣x 24好一點)。非常有幫助謝謝! – Sha

1

你可以這樣說:

for col = 1:size(L, 2) 
    for I = 1:n-1 
     for J = I:n 
      i = L(I,col); 
      j = L(J,col); 
      %// As an example just print out the loop variable values 
      disp(sprintf('Col:%d\ti:%d\tj:%d\r\n',col,i,j)) 
     end 
    end 
end 
+1

@AndrasDeak nope,應該先測試一下。現在工作...(順便說一句除了列矢量問題之外還有很多問題) – Dan

+1

非常感謝你 – Sha