双循环,如何设置非连续索引?

时间:2016-03-18 16:53:20

标签: matlab

如果我想构造一个double for循环,但对于index k我不希望它是连续索引,而是像[1,2,4,7]。我试图做以下事情,但它没有用。

for i=1:100
    for k=1:2:4:7;
        b(i)=i*k;
    end
end

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

如果您想构建一个数组,除非您想创建一个范围值,否则您不一定要使用colon (:) operator(就像您想要的那样) []为1到100之间的所有值,而您希望使用带逗号分隔符的方括号(k = [1,2,4,7]; )来显式创建离散值数组。

k

既然你这样做了,你就可以用kvalues = [1,2,4,7]; for i = 1:100 for k = 1:numel(kvalues) b(i) = i * kvalues(k); end end

的值替换来指定你的循环
kvalues

请注意,我已经在循环外定义了b(i) 一次,因此不会在每次迭代时通过外循环创建它(感谢@dfri指出这种疏忽)

你编写循环的方式,每次通过内循环,你实际上覆盖 b = k(end) * (1:100); 的值。我不确定这是不是你打算做什么。如果是,那么您可以将循环减少到以下内容:

b(i,k) = i * k

否则,如果您打算将其bsxfun,则可以使用b = bsxfun(@mtimes, [1,2,4,7], (1:100).'); 重写此内容。

getDay()

答案 1 :(得分:0)

语法k=1:2:4:7无法按预期运行。通常我们会使用"两个冒号"用于描述从给定1startend的非默认(k = start:stepSize:end)步长的语法。在这里使用额外的冒号甚至会产生一个Matlab警告("第三个冒号可能无意?" )。

一种可能的解决方法是让您的"非连续"索引驻留在向量中,并在内部for循环中提取此向量的成员,如下所示

nonContIndex = [1; 2; 4; 7];
numIndices = numel(nonContIndex);
b = zeros(100,numIndices);
for i=1:100
  for k=1:numIndices
    b(i,k)=i*nonContIndex(k);
  end
end

正如注释和其他答案所述:如果b只是一个向量,那么原始循环将覆盖内循环每次运行的b(i):th条目。以上假设您实际上想要一个2D矩阵。