Использование sub2ind, он будет конвертировать подиндексы линейных индексов, что ряд указывая на одно точное пятно в матрице (more info).
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;
Почему вы хотите избежать цикла здесь? –
@MarcusRiemer, потому что я собираюсь применить эту вещь на больших изображениях. На самом деле огромные. И я чувствую, Vectorization поможет моему коду работать намного быстрее, чем простой для циклов. – shahensha