ryhor 0 7 декабря, 2007 Опубликовано 7 декабря, 2007 · Жалоба Интересная интересность. 1. делаю так clear a = [1 2 3 4]; % source idx = [2 4 4 8]; % index b = zeros(1,8); % dest b(idx) = b(idx) + a b = 0 1 0 3 0 0 0 4 результат для элемента b(4) - мягко скажем настораживает 2. делаю так clear a = [1 2 3 4]; idx = [2 4 4 8]; b = zeros(1,8); for i=1:4 ... b(idx(i)) = b(idx(i)) + a(i); ... end b b = 0 1 0 5 0 0 0 4 результат в b(4) радует. Понятно если бы я просто присваивал типа b(idx) = a; но я же прошу просуммировать - и в результате как то не правильно. Возможно это свойство - я доку не читал внимательно, но для меня это оказалось неожиданным свойством. Подскажите где не правильно пошла моя мысль? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Alfred_ 0 8 декабря, 2007 Опубликовано 8 декабря, 2007 · Жалоба Сам был удивлен! Могу лишь сделать предположение, что при выполненни операции результат хранится во временном массиве и переносится в b только в самом конце (т.е. каждый раз используется обнуленный входной масив). Это подтверждается следующим примером: >> clear >> b = zeros(1,8); >> a = [1 2 3 4]; >> idx = [2 2 2 2]; >> b(idx) = b(idx) + a b = 0 4 0 0 0 0 0 0 По поводу того, правильно это или нет - боюсь сказать ничего не смогу т.к. про Matlab читал не много, да и пользуюсь им не часто... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
popeye 0 9 декабря, 2007 Опубликовано 9 декабря, 2007 · Жалоба А что Вас удивляет в пункте 1? Вы берете 2-ой, 4-ый и 8-ой элементы вектора b (нули) и складываете с вектором a, результатом чего является вектор [1 2 3 4], а потом делаете присваивание выбранным элементам. 4-ый элемент получает значение дважды, поэтому значение 2 перезаписывается тройкой. Всё правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ryhor 0 10 декабря, 2007 Опубликовано 10 декабря, 2007 · Жалоба А что Вас удивляет в пункте 1? Вы берете 2-ой, 4-ый и 8-ой элементы вектора b (нули) и складываете с вектором a.. Если я возьму 2-ой, 4-ый и 8-ой элементы вектора b то с вектором a оно не сложится по причине разной длины векторов. если же я беру 4 элемент два раза - тогда что то может быть. но! я прошу сложить мне с такими индексами, а не поиграться с ними. Я понимаю что так легче программировать :) - и это типо не баг, а свойство. Но свойство достаточно не ожиданное - при общепринятом понимании индексного обращения к элементам вектора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться