Как я могу изменить значения нескольких точек в матрице? - PullRequest
2 голосов
/ 27 июля 2011

У меня есть матрица [500x500].У меня есть другая матрица [2x100], которая содержит пары координат, которые могут быть внутри первой матрицы.Я хотел бы иметь возможность изменить все значения первой матрицы на ноль, без цикла.

mtx = magic(500);
co_ords = [30,50,70;  30,50,70];
mtx(co_ords) = 0;

Ответы [ 3 ]

7 голосов
/ 27 июля 2011

Вы можете сделать это, используя функцию SUB2IND для преобразования ваших пар индексов в линейный индекс:

mtx(sub2ind(size(mtx),co_ords(1,:),co_ords(2,:))) = 0;
1 голос
/ 28 июля 2011

Другой ответ:

mtx(co_ords(1,:)+(co_ords(2,:)-1)*500)=0;
0 голосов
/ 24 января 2014

Я наткнулся на этот вопрос, когда искал похожую проблему в 3D. У меня были индексы строк и столбцов, и я хотел изменить все значения, соответствующие этим индексам, но на каждой странице (так во всем 3-м измерении). По сути, я хотел выполнить mtx(row(i),col(i),:) = 0;, но без циклического перебора векторов строки и столбца.

Я думал, что поделюсь своим решением здесь, вместо того, чтобы задавать новый вопрос, поскольку он тесно связан.

Еще одним отличием было то, что линейные индексы были доступны мне с самого начала, потому что я определял их, используя find. Я включу эту часть для ясности.

mtx = rand(100,100,3); % you guessed it, image data
mtx2d = sum(mtx,3); % this is similar to brightness
ind = find( mtx2d < 1.5 ); % filter out all pixels below some threshold

% now comes the interesting part, the index magic
allind = sub2ind([numel(mtx2d),3],repmat(ind,1,3),repmat(1:3,numel(ind),1));
mtx(allind) = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...