循环索引问题
4次观看(最近30天)
显示较旧的评论
问候大家,
我正在尝试使用此代码进行简单的循环:
为了k = 1:size(rm_zerohoras,1)
为了j = 1:size(Finati,1)
如果rm_zerohoras(k)== finati.data(j)
Finati(J,:) = [];
结尾
结尾
结尾
rm_zerohoras包含我需要从Finati中删除的数据。我的目的是,每当循环在Finati的一行上找到相应的DateTime时,整个行都会在Finati上删除。我将同时附加RM_Zerohoras和Finati,以更好地理解。当前的问题是,当我运行程序时,出现以下错误:
“使用表格/dotparenReference的错误(第108行)
索引超过数组元素的数量(474)。”
我认为这与Finati的大小有关,Finati每当循环通过时就会收缩。但是我该如何克服这一点呢?
提前致谢,
亚瑟。
0评论
接受的答案
亚历克斯·麦克劳利(Alex McAulley)
2020年3月9日
避免循环的一种简单方法是:
idx = ismember(finati.data,rm_zerohoras);
Finati(IDX,:) = [];
更多答案(1)
亚当
2020年3月9日
计算您要删除的所有行的索引,然后一口气删除它们,例如
Rowstodelete = [1 5 7 8];
Finati(Rowstodelete,:)= [];
有一种计算这些索引的媒介方法,但如果不是简单地将它们存储在循环中,而不是实际删除行。
如果事件的数量不是巨大的,尽管它会发出代码警告,但在循环中生长一系列零件的成本可以忽略不计。
您切勿删除您正在向前迭代的数组的元素 - 它永远不会结束。如果您向后迭代,您可以做到这一点,但是我的第一个建议仍然要干净得多,因为一次删除行要比一口气删除它们要慢得多。