私はマトリックスを言う
Z = [1 2 3;
4 5 6;
7 8 9]
たとえば、位置 (2,2) と (3,1) の値を、指定された値に変更する必要があります。2 つの行列がrowNos
ありcolNos
、これらの位置が含まれています。
rowNos = [2, 3]
colNos = [2, 1]
これらの位置にある要素の値を 0 に変更したいとしましょう。
forループを使わずにどうやってそれを行うことができますか?
私はマトリックスを言う
Z = [1 2 3;
4 5 6;
7 8 9]
たとえば、位置 (2,2) と (3,1) の値を、指定された値に変更する必要があります。2 つの行列がrowNos
ありcolNos
、これらの位置が含まれています。
rowNos = [2, 3]
colNos = [2, 1]
これらの位置にある要素の値を 0 に変更したいとしましょう。
forループを使わずにどうやってそれを行うことができますか?
sub2indを使用すると、サブインデックスが線形インデックスに変換されます。これは、マトリックス内の 1 つの正確なスポットを指す数値です (詳細)。
Z = [ 1 2 3 ; 4 5 6 ; 7 8 9];
rowNos = [2, 3];
colNos = [2, 1];
lin_idcs = sub2ind(size(Z), rowNos, colNos)
特定の行と列のすべての要素 (より高い次元の要素) を操作する場合は、線形インデックスを使用してそれらに対処することもできます。それらを計算するのが少し面倒になるだけです:
Z = reshape(1:4*4*3,[4 4 3]);
rowNos = [2, 3];
colNos = [2, 1];
siz = size(Z);
lin_idcs = sub2ind(siz, rowNos, colNos,ones(size(rowNos))); % just the first element of the remaining dimensions
lin_idcs_all = bsxfun(@plus,lin_idcs',prod(siz(1:2))*(0:prod(siz(3:end))-1)); % all of them
lin_idcs_all = lin_idcs_all(:);
Z(lin_idcs_all) = 0;
sub2ind を少し試して、コードを段階的に見て理解してください。
すべての要素を削除したい最初の次元であれば、コロン演算子を使用できた方が簡単だったでしょう。:
Z = reshape(1:3*4*4,[3 4 4]);
rowNos = [2, 3];
colNos = [2, 1];
siz = size(Z);
lin_idcs = sub2ind(siz(2:end),rowNos,colNos);
Z(:,lin_idcs) = 0;
sub2ind
行と列の複数のエントリで使用
Z(sub2ind(size(Z), rowNos, colNos))=0
例:
Z = [1 2 3;
4 5 6;
7 8 9];
rowNos = [2, 3];
colNos = [2, 1];
Z(sub2ind(size(Z), rowNos, colNos))=0
Z =
1 2 3
4 0 6
0 8 9
あなたはこれをしたいです
z(rowNos, colNos)
しかし、できません。MATLAB は、インデックスのデカルト積を実行します。あなたはこのトリックを行うことができます
idx=(colNos-1)*size(z, 1)+rowNos;
z(idx)=0
z マトリックスをフラット化し、rowNos と colNos の組み合わせである線形インデックスを介してアクセスします。MATLAB は行列を列ごとに平坦化することに注意してください (列ベースの行列ストレージ)。