2016-02-19 115 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