14

整数の行列があり、2 のすべての外観を -5 に置き換える必要があります。それを行う最も効率的な方法は何ですか?以下の方法で作成しましたが、もっとエレガントな方法があると思います。

a=[1,2,3;1,3,5;2,2,2]
ind_plain = find(a == 2)
[row_indx col_indx] = ind2sub(size(a), ind_plain)
for el_id=1:length(row_indx)
    a(row_indx(el_id),col_indx(el_id)) = -5;
end

ループ II の代わりに、a(row_indx,col_indx) = -5 のようなものを探しますが、これは機能しません。

4

4 に答える 4

28

findこの場合は必要ありません。代わりに論理インデックスを使用します。

a(a == 2) = -5

行列が等しいかどうかを検索する場合は、inf使用する必要があります

a(isinf(a)) = -5

一般的なケースは次のとおりです。

Mat(boolMask) = val

ここで Mat、 は行列、は値boolMaskの別の行列、は代入値ですlogicalval

于 2012-08-14T12:15:12.917 に答える
13

これを試して:

a(a==2) = -5;

やや長いバージョンは

ind_plain = find(a == 2);
a(ind_plain) = -5;

つまり、線形インデックスを使用して直接行列にインデックスを付けることができます。使用して変換する必要はありませんind2sub。非常に便利です。ただし、上で示したように、ブール行列を使用して行列にインデックスを付けると、さらに短くすることができます。

ところで、ステートメントの結果をコンソールにダンプすることに関心がない場合 (通常はそうです) は、ステートメントの後にセミコロンを付けてください。

于 2012-08-14T12:15:36.440 に答える
1

ベクトルの値を変更する場合は、Martin B の方法が適しています。ただし、マトリックスで使用するには、線形インデックスを取得する必要があります。

私が見つけた最も簡単な解決策は、changem関数を使用することです。非常に使いやすい:

mapout = changem(Z,newcode,oldcode) あなたの場合:newA = changem(a, 5, -2)

詳細: http://www.mathworks.com/help/map/ref/changem.html

于 2014-05-25T14:22:38.417 に答える
0

changemこれは、Mapping Toolbox からの簡単な、最適化されていない、おそらく遅い実装です。

function mapout = changem(Z, newcode, oldcode)
% Idential to the Mapping Toolbox's changem
% Note the weird order: newcode, oldcode. I left it unchanged from Matlab.
    if numel(newcode) ~= numel(oldcode)
        error('newcode and oldcode must be equal length');
    end

    mapout = Z;

    for ii = 1:numel(oldcode)
        mapout(Z == oldcode(ii)) = newcode(ii);
    end
end
于 2015-01-26T10:18:26.283 に答える