“matlab错误”;索引超出了矩阵维度”;使用特定的数据文件
我将以下代码用于不同的数据文件,没有任何问题。但是,有一个文件会产生问题,当我使用该文件运行代码时,我得到一个错误: “索引超出了矩阵维度。” 我认为这是因为“I”等于2546,但当代码运行该行时:“matlab错误”;索引超出了矩阵维度”;使用特定的数据文件,matlab,loops,indexing,Matlab,Loops,Indexing,我将以下代码用于不同的数据文件,没有任何问题。但是,有一个文件会产生问题,当我使用该文件运行代码时,我得到一个错误: “索引超出了矩阵维度。” 我认为这是因为“I”等于2546,但当代码运行该行时:I=I+1,而不是在2546处停止,而是继续运行并在2547处停止(给出错误)-这当然超过了矩阵维度。事实上,当代码停止工作并产生错误时,我可以在工作区中看到“I”等于2547,“j”等于2(而不是5,如果循环工作正常的话) 由于完全相同的代码可以很好地处理其他文件,因此我假设与此特定文件有关。对如何
I=I+1
,而不是在2546处停止,而是继续运行并在2547处停止(给出错误)-这当然超过了矩阵维度。事实上,当代码停止工作并产生错误时,我可以在工作区中看到“I”等于2547,“j”等于2(而不是5,如果循环工作正常的话)
由于完全相同的代码可以很好地处理其他文件,因此我假设与此特定文件有关。对如何解决这个问题有什么见解吗
代码如下:
for i=1:size(colInd,1)
for j=1:size(colInd,2)
if colInd(i,j)>0 && colInd(i,j)<=13
M1(i,j)=Windowsdata(i,colInd(i,j));
elseif colInd(i,j)==0 | colInd(i,j)==14
M1(i,j)=NaN;
elseif colInd(i,j)==-1 | colInd(i,j)==15
M1(i,:)=NaN;
i=i+1;
end
end
end
Windowsdata中的示例行,2546 x 13双精度
-4.37370443344116 -1.64714550971985 0.569347918033600 1.62668454647064 3.73541021347046 5.15196514129639 4.04361486434937 1.77491927146912 0.702701866626740 -0.354207783937454 1.18695282936096 2.82701897621155 4.01644039154053
3.72757863998413 1.44241857528687 -1.15181946754456 -2.97936320304871 -5.16328191757202 -4.25508642196655 -2.47518587112427 0.287524074316025 -1.17596077919006 -2.04023623466492 -2.78539514541626 -2.96725606918335 -5.59557294845581
-5.52127933502197 -1.69257545471191 3.61181259155273 4.46472501754761 0.345008432865143 -4.78608989715576 -7.80892658233643 -8.83082866668701 -5.61083126068115 -4.40270948410034 -3.05102157592773 -4.67261123657227 -5.50971889495850
1.24733197689056 0.692575275897980 0.549045324325562 1.33569169044495 2.26527953147888 3.19271230697632 1.92626762390137 -0.00543282041326165 -1.76812970638275 -3.55482935905457 -2.28071475028992 2.58129334449768 6.07476711273193
2.17950797080994 2.73428583145142 1.63492679595947 -0.256836771965027 -0.773400425910950 -1.04227805137634 -1.82435607910156 -2.64025163650513 -1.53338134288788 -2.29410648345947 -4.26442241668701 -4.76120758056641 -4.47712421417236
-0.246993020176888 0.157185763120651 0.250829964876175 -0.986824631690979 1.40918886661530 5.03370332717896 8.15515422821045 6.41663646697998 2.43448591232300 -2.98093175888062 -3.53510475158691 -1.89243125915527 1.47953033447266
4.36318445205688 5.06837177276611 5.78645181655884 6.97499608993530 7.49895095825195 5.27076244354248 4.75153970718384 4.35132837295532 2.37539553642273 0.0745598822832108 0.782306909561157 1.98255372047424 1.82295107841492
0.393009424209595 0.348423480987549 -0.0242169145494699 -0.451373100280762 0.792472958564758 3.95410203933716 6.95971775054932 6.07247447967529 4.61793804168701 2.25326156616211 1.17793440818787 -1.02191674709320 -1.40514099597931
2.97367334365845 2.56695508956909 -0.0324615947902203 -0.512259364128113 -0.169182881712914 1.99416732788086 2.05820631980896 1.26427924633026 -0.107465483248234 -1.26579785346985 -2.51656532287598 -2.19553661346436 -1.86673855781555
-5.92374515533447 -4.78130531311035 -5.02523994445801 -4.12971973419189 -2.56698751449585 -2.16855669021606 -2.66882371902466 -3.24165868759155 -4.10617780685425 -4.71752023696899 -4.63748264312744 -3.33325529098511 -2.00388121604919
如果我理解正确,
colInd
是一个NxM
矩阵,具有N=2546
,您有一个期望,在您的上一个elseif中,通过将I
增加一个,您将在下一个外部for循环迭代中结束,从1
开始j
到M
(I+1)th迭代
如果这是您想要实现的行为,则需要使用
break
语句中断内部for循环。否则,如果j请提供完整的错误消息和a。完整的错误消息如我所报告的索引超出了矩阵维度。
。没有说明我可以报告或引用的行。索引超过了矩阵维度。
是命令窗口中唯一的内容吗?什么是Windowsdata
?它与colInd
有什么关系?请参阅上面链接的帮助页面的“完成”部分。添加break
我没有得到错误,但是,当该部分运行并完成时,I
仍然等于2547,j
现在等于1,这表明代码在第一个循环处停止,并且没有在从2到5的循环中运行。或者,这就是您想要检查的?很明显,i=2547
,因为您在上一个elseif的内部循环中将i
增加了1。看来我误解了您对算法的预期行为,因为您没有正确描述您希望它做什么。如果你能给出一个玩具般的例子,说明你的算法失败的情况,并描述你期望从算法中得到的行为,那将非常有帮助。请参阅我在初始答案下面添加的解释。我需要算法做的是在Windowsdata中找到与colInd中的索引相对应的值。但是,如果每行的任何单元格(在colInd中)等于零或14,我想用NaN替换该特定单元格(但不是整行)。如果每行的任何单元格(在colInd中)等于-1或15,我希望整行都是NaN。当我运行生成错误的代码时,它按照算法的功能工作,但它停止了。看起来你的colInd
向量在第二维度上严格增加。这意味着只有当最后一行包含一个等于-1
的元素时(并且由于它在第二维度中严格增加,所以只能作为第一个元素出现),或者类似地,如果最后一行第五个元素之前的任何元素等于15
,才会发生错误。这是您的实现错误,而不是数据错误。你的算法没有完全做到它应该做的。使用一个小玩具示例,并使用调试工具观察其行为。
-4.37370443344116 -1.64714550971985 0.569347918033600 1.62668454647064 3.73541021347046 5.15196514129639 4.04361486434937 1.77491927146912 0.702701866626740 -0.354207783937454 1.18695282936096 2.82701897621155 4.01644039154053
3.72757863998413 1.44241857528687 -1.15181946754456 -2.97936320304871 -5.16328191757202 -4.25508642196655 -2.47518587112427 0.287524074316025 -1.17596077919006 -2.04023623466492 -2.78539514541626 -2.96725606918335 -5.59557294845581
-5.52127933502197 -1.69257545471191 3.61181259155273 4.46472501754761 0.345008432865143 -4.78608989715576 -7.80892658233643 -8.83082866668701 -5.61083126068115 -4.40270948410034 -3.05102157592773 -4.67261123657227 -5.50971889495850
1.24733197689056 0.692575275897980 0.549045324325562 1.33569169044495 2.26527953147888 3.19271230697632 1.92626762390137 -0.00543282041326165 -1.76812970638275 -3.55482935905457 -2.28071475028992 2.58129334449768 6.07476711273193
2.17950797080994 2.73428583145142 1.63492679595947 -0.256836771965027 -0.773400425910950 -1.04227805137634 -1.82435607910156 -2.64025163650513 -1.53338134288788 -2.29410648345947 -4.26442241668701 -4.76120758056641 -4.47712421417236
-0.246993020176888 0.157185763120651 0.250829964876175 -0.986824631690979 1.40918886661530 5.03370332717896 8.15515422821045 6.41663646697998 2.43448591232300 -2.98093175888062 -3.53510475158691 -1.89243125915527 1.47953033447266
4.36318445205688 5.06837177276611 5.78645181655884 6.97499608993530 7.49895095825195 5.27076244354248 4.75153970718384 4.35132837295532 2.37539553642273 0.0745598822832108 0.782306909561157 1.98255372047424 1.82295107841492
0.393009424209595 0.348423480987549 -0.0242169145494699 -0.451373100280762 0.792472958564758 3.95410203933716 6.95971775054932 6.07247447967529 4.61793804168701 2.25326156616211 1.17793440818787 -1.02191674709320 -1.40514099597931
2.97367334365845 2.56695508956909 -0.0324615947902203 -0.512259364128113 -0.169182881712914 1.99416732788086 2.05820631980896 1.26427924633026 -0.107465483248234 -1.26579785346985 -2.51656532287598 -2.19553661346436 -1.86673855781555
-5.92374515533447 -4.78130531311035 -5.02523994445801 -4.12971973419189 -2.56698751449585 -2.16855669021606 -2.66882371902466 -3.24165868759155 -4.10617780685425 -4.71752023696899 -4.63748264312744 -3.33325529098511 -2.00388121604919
for i=1:size(colInd,1)
for j=1:size(colInd,2)
if colInd(i,j)>0 && colInd(i,j)<=13
M1(i,j)=Windowsdata(i,colInd(i,j));
elseif colInd(i,j)==0 | colInd(i,j)==14
M1(i,j)=NaN;
elseif colInd(i,j)==-1 | colInd(i,j)==15
M1(i,:)=NaN;
break;
end
end
end
colInd = [ 4 5 6 7 8;
-1 0 1 2 3;
2 3 4 5 6;
11 12 13 14 15;
0 1 2 3 4;
5 6 7 8 9;
3 4 5 6 7;
5 6 7 8 9;
-1 0 1 2 3;
11 12 13 14 15;
10 11 12 13 14];
Windowsdata = reshape([1:size(colInd,1)*13],[size(colInd,1) 13]);
M1 = zeros(size(colInd));
M2 = zeros(size(colInd));
c1 = find(colInd>0&colInd<=13);
c2 = find(colInd==0|colInd==14);
c3 = find(colInd==-1|colInd==15);
[x1,~] = ind2sub(size(colInd),c1);
[x3,~] = ind2sub(size(colInd),c3);
M2(c1) = Windowsdata(sub2ind(size(Windowsdata),x1,colInd(c1)));
M2(c2) = NaN;
M2(x3,:) = NaN;
M1 =
34 45 56 67 78
NaN NaN NaN NaN NaN
14 25 36 47 58
NaN NaN NaN NaN NaN
NaN 5 16 27 38
50 61 72 83 94
29 40 51 62 73
52 63 74 85 96
NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN
110 121 132 143 NaN
M2 =
34 45 56 67 78
NaN NaN NaN NaN NaN
14 25 36 47 58
NaN NaN NaN NaN NaN
NaN 5 16 27 38
50 61 72 83 94
29 40 51 62 73
52 63 74 85 96
NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN
110 121 132 143 NaN