Подтвердить что ты не робот

Заменить значения в матрице другими значениями

У меня есть матрица с целыми числами, и мне нужно заменить все проявления 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

Вместо цикла я ищу что-то вроде: a (row_indx, col_indx) = -5, которое не работает.

4b9b3361

Ответ 1

find в этом случае не требуется. Вместо этого используйте логическую индексацию:

a(a == 2) = -5

В случае поиска, равна ли матрица inf, вы должны использовать

a(isinf(a)) = -5

Общий случай:

Mat(boolMask) = val

где Mat - ваша матрица, boolMask - это еще одна матрица значений logical, а val - значение присваивания

Ответ 2

Попробуйте следующее:

a(a==2) = -5;

Несколько более длинная версия будет

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

Другими словами, вы можете индексировать матрицу напрямую с помощью линейных индексов, нет необходимости их конвертировать с помощью ind2sub - очень полезно! Но, как показано выше, вы можете стать еще короче, если индексировать матрицу с помощью булевой матрицы.

Кстати, вы должны ставить точки с запятой после ваших утверждений, если (как это обычно бывает) вам не интересно получать результат выгрузки из консоли на консоль.

Ответ 3

Метод Мартина B хорош, если вы меняете значения в векторе. Однако, чтобы использовать его в матрице, вам нужно получить линейные индексы.

Самое легкое решение, которое я нашел, - использовать функцию changem. Очень проста в использовании:

mapout = changem(Z,newcode,oldcode) В вашем случае: newA = changem(a, 5, -2)

Дополнительная информация: http://www.mathworks.com/help/map/ref/changem.html

Ответ 4

Здесь тривиальная, неоптимизированная, возможно медленная реализация changem из панели инструментов отображения.

function mapout = changem(Z, newcode, oldcode)
% Idential to the Mapping Toolbox 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