当尝试编写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修复了问题并且函数按预期工作,但它没有似乎是正确的解决方案。有没有人对此有解释?
答案 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]
。