2

私はマトリックスを言う

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ループを使わずにどうやってそれを行うことができますか?

4

3 に答える 3

6

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;
于 2012-09-06T07:00:53.350 に答える
2

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
于 2012-09-06T07:00:38.203 に答える
1

あなたはこれをしたいです

z(rowNos, colNos)

しかし、できません。MATLAB は、インデックスのデカルト積を実行します。あなたはこのトリックを行うことができます

idx=(colNos-1)*size(z, 1)+rowNos;
z(idx)=0

z マトリックスをフラット化し、rowNos と colNos の組み合わせである線形インデックスを介してアクセスします。MATLAB は行列を列ごとに平坦化することに注意してください (列ベースの行列ストレージ)。

于 2012-09-06T07:02:51.590 に答える