matlab: адресация одного индекса без sub2ind - PullRequest
1 голос
/ 04 мая 2011

Это очень тесно связано с другим вопросом , но этот вопрос хотел избежать sub2ind из-за проблем с производительностью. Меня больше беспокоит «нелегальность» использования sub2ind.

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

z = zeros(10,4);
rchoice = [3 1 8 7];
newvals = [123 456 789 10];
% ??? I would like to set z(3,1)=123, z(1,2)=456, z(8,3)=789, z(7,4)=10

Я могу использовать sub2ind для выполнения этого (который я использовал в ответе на тесно связанный вопрос ):

z(sub2ind(size(z),rchoice,1:4)) = newvals

но есть ли другая альтернатива? Похоже, логическая адресация может быть использована каким-то образом, но я в замешательстве, потому что для установки элементов логической матрицы в 1 вы имеете дело с теми же позициями элементов, что и в той матрице, которую вы действительно хотите адресовать.

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Существует намного более простой способ сделать это.

nCols=size(z,2);
z(rchoice,1:nCols)=diag(newvals);
2 голосов
/ 04 мая 2011

Вы можете просто добавить количество строк в предыдущих столбцах к rchoice, чтобы получить линейный индекс напрямую.

nRows = size(z,1); %# in case you don't know this already
nCols2write = length(newvals);
z(rchoice+[0:nRows:(nRows*(nCols2write-1)]) = newvals;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...