このプログラムを実行すると、エラーメッセージが表示されます。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のマトリックスの寸法に関するエラーメッセージ
???インデックスが行列の次元を超えています。
==> 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
理由は、行列から列を削除しているため、forループ内で次元が小さくなっているためです。次に、列が削除される前に、元の行列を参照するインデックスを持つ列にアクセスしようとします。
は、代わりにこれを試してみてください:
a = randi(5,4,100)-1;
ind2remove = (a(1,:) == 0);
a(:,ind2remove) = [];
このfor
ループの実行中に、あなたには、いくつかの列を削除する可能性があるため、あなたはそのエラーを取得します。したがって、マトリックスの寸法が小さくなり、別の場所に移動された要素にアクセスしようとします。
あなたが望むようにするには、while
ループを書き込んで、インデックスを手動でチェックしておく必要があります。他の解決策は、Katzが示しているように、あなたのソリューションをベクトル化することです。その解決策は、while
ループを書くよりもMATLAB風です。
しかしランダムなアルゴリズムでランダムな長さのベクトルを放射させると、固定長のベクトルよりも扱いが困難になることがあります。そのため、アプリケーションによっては、最初の行と異なる命令を持つ他の行を生成することによって、このようなエントリを削除する必要がないような方法でベクターを構築することができます。
ランダムベクトルは、私のプログラムの正確さを検証するためのものでした。 – bzak