【问题标题】:indexing for loop matlab循环matlab的索引
【发布时间】:2016-06-01 01:58:44
【问题描述】:

我想做以下事情:

例如,我创建了一个包含来自1:n 的所有可能排列的矩阵

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

我得到了一个 4-by-24 矩阵的预期输出:

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

现在我想将此矩阵用于for 循环的索引:

使用第一列,我想为循环的输入提供以下索引:i=4j=3,2,1。然后为i=3j=2,1。然后为i=2j=1。 i=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 获取条目的值,当我写 L(1,1):L(4,1) 时,这并不意味着返回从第一行到第四行的条目,而是从值中返回具有增量 1 的所有数字L(1,1) 到 L(4,1) 的值(这里为空)。

有什么想法吗?提前非常感谢你

【问题讨论】:

  • 数组循环需要行向量,尝试循环L(1:4,1).'(注意转置)。
  • @AndrasDeak 是的,谢谢

标签: matlab loops indexing


【解决方案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

【讨论】:

  • @AndrasDeak 不,应该先测试它。现在工作......(顺便说一句,除了列向量问题之外还有很多问题)
【解决方案2】:

我相信这样的事情会解决你的问题。

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

这适用于对象数组、元胞数组,基本上是任何单行矩阵。

【讨论】:

  • 谢谢你的作品!通过“for k = [L(rowIdx+:end,col)]'”而不是 for k = [L(rowIdx:end,col)]'(当 n=4 时,对于每个迭代我得到 6 个矩阵 x 24,这比 10 个矩阵 x 24 好一点)。非常有帮助,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
相关资源
最近更新 更多