对于Matlab中的循环行为非常奇怪

时间:2014-02-23 06:42:40

标签: matlab debugging loops

当尝试编写for循环以从1递增到数组末尾时,Matlab会抛出一个错误,说我试图访问第0个不存在的数组元素。这是有问题的片段:

     function [adjMatNew] = delete(obj, adjMat)
        [~, n] = size(adjMat);
        adjMatNew = adjMat;
        for i = 1:n
            if adjMat(obj.number, i) ~= 0
                adjList(i) = i
            end 
        end

        for j = 1:numel(adjList)
            for k = 1:numel(adjList)
                if j ~= k
                    adjMatNew(adjList(k), adjList(j)) = 1;
                end
            end
        end

        adjMatNew(obj.number, :) = 0;
        adjMatNew(:, obj.number) = 0;
    end

我想不出任何可能的原因,在上面的for循环中,循环从0开始。将起始增量变量从1更改为2修复了问题并且函数按预期工作,但它没有似乎是正确的解决方案。有没有人对此有解释?

2 个答案:

答案 0 :(得分:3)

没有任何帮助或评论,你真正想要做的事情并不是很清楚;但是,在线 adjMatNew(adjList(k), adjList(j)) = 1; 你隐含地假设adjList永远不会为零。由于显然是这种情况,你会收到错误。

答案 1 :(得分:0)

正如其他评论/答案中所建议的那样,问题在于您构建adjList

  for i = 1:n
     if adjMat(obj.number, i) ~= 0
          adjList(i) = i
     end 
  end

让我们考虑在n = 3

的三种不同情况下会发生什么

1)如果adjMat(obj.number, 1:3)全部为~=0,则每个循环

adjList(1) = 1;
adjList(2) = 2;
adjList(3) = 3;

output: adjList = [1,2,3];

这种情况不应该抛出错误。

2)如果adjMat(obj.number, 3)为零:

adjList(1) = 1;
adjList(2) = 2;
% adjList(3) not set

output: adjList = [1,2];

此处也没有错误。

3)如果adjMat(obj.number, 2)为零:

adjList(1) = 1;
% adjList(2) not set
adjList(3) = 3;

由于未设置adjList(2),因此在调用adjList(3) = 3;时,MATLAB需要为adjList(2)设置一些值。默认情况下,这是通过填充零来处理矩阵的正确尺寸:

输出:adjList = [1 0 3];

这会导致错误。

根据Notlikethat的评论中的建议,adjList = find(adjMat(obj.number,:))将是替换此循环的好方法。在这种情况下,它只返回非零元素的位置,因此在上面的第三种情况中,输出将为adjList = [1 3]