Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: индексные операции в Matlab.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
ryhor
Интересная интересность.

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_
Сам был удивлен!
Могу лишь сделать предположение, что при выполненни операции результат хранится во временном массиве и переносится в 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
А что Вас удивляет в пункте 1?

Вы берете 2-ой, 4-ый и 8-ой элементы вектора b (нули) и складываете с вектором a, результатом чего является вектор [1 2 3 4], а потом делаете присваивание выбранным элементам. 4-ый элемент получает значение дважды, поэтому значение 2 перезаписывается тройкой. Всё правильно.
ryhor
Цитата(popeye @ Dec 9 2007, 18:57) *
А что Вас удивляет в пункте 1?

Вы берете 2-ой, 4-ый и 8-ой элементы вектора b (нули) и складываете с вектором a..


Если я возьму 2-ой, 4-ый и 8-ой элементы вектора b то с вектором a оно не сложится по причине разной длины векторов.
если же я беру 4 элемент два раза - тогда что то может быть.
но! я прошу сложить мне с такими индексами, а не поиграться с ними.
Я понимаю что так легче программировать smile.gif - и это типо не баг, а свойство. Но свойство достаточно не ожиданное - при общепринятом понимании индексного обращения к элементам вектора.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.