【发布时间】:2012-01-01 18:23:56
【问题描述】:
当我运行这个程序时,我收到错误消息:
???索引超出矩阵维度。
如果 a(1,i)==0 则 ==> 出错
你能告诉我为什么吗??
a = randi(5,4,100)-ones(4,100);
[n m]=size(a);
for i=1:m
if a(1,i)==0
a(:,i)=[];
end
end
【问题讨论】:
标签: matlab
当我运行这个程序时,我收到错误消息:
???索引超出矩阵维度。
如果 a(1,i)==0 则 ==> 出错
你能告诉我为什么吗??
a = randi(5,4,100)-ones(4,100);
[n m]=size(a);
for i=1:m
if a(1,i)==0
a(:,i)=[];
end
end
【问题讨论】:
标签: matlab
原因是您要从矩阵中删除列,因此在 for 循环中您要减少其维度。然后,您尝试在删除列之前访问具有引用原始矩阵的索引的列。
试试这个:
a = randi(5,4,100)-1;
ind2remove = (a(1,:) == 0);
a(:,ind2remove) = [];
【讨论】:
您收到该错误是因为在执行此 for 循环期间,您可能会删除一些列。因此矩阵的维度会减小,您将尝试访问已移动到不同位置的元素。
要做你想做的事,你要么必须编写一个while 循环,手动检查索引。另一种解决方案是矢量化您的解决方案,如 itamar Katz 所示。该解决方案比编写while 循环更具 MATLAB 风格。
但我注意到,允许随机算法发出随机长度的向量有时会比固定长度的向量更难处理。因此,您可能希望以一种甚至不必删除此类条目的方式构建向量,具体取决于您的应用程序,这可以通过生成第一行和具有不同指令的其他行来完成。
【讨论】: