реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> индексные операции в Matlab., непонятно на что наткнулся - - это свойство или баг?
ryhor
сообщение Dec 7 2007, 05:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 3-04-06
Пользователь №: 15 742



Интересная интересность.

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;
но я же прошу просуммировать - и в результате как то не правильно.

Возможно это свойство - я доку не читал внимательно, но для меня это оказалось неожиданным свойством.

Подскажите где не правильно пошла моя мысль?
Go to the top of the page
 
+Quote Post
_Alfred_
сообщение Dec 8 2007, 23:29
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 13-07-05
Пользователь №: 6 757



Сам был удивлен!
Могу лишь сделать предположение, что при выполненни операции результат хранится во временном массиве и переносится в 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 читал не много, да и пользуюсь им не часто...
Go to the top of the page
 
+Quote Post
popeye
сообщение Dec 9 2007, 14:57
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 92
Регистрация: 18-08-05
Пользователь №: 7 750



А что Вас удивляет в пункте 1?

Вы берете 2-ой, 4-ый и 8-ой элементы вектора b (нули) и складываете с вектором a, результатом чего является вектор [1 2 3 4], а потом делаете присваивание выбранным элементам. 4-ый элемент получает значение дважды, поэтому значение 2 перезаписывается тройкой. Всё правильно.
Go to the top of the page
 
+Quote Post
ryhor
сообщение Dec 10 2007, 02:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 3-04-06
Пользователь №: 15 742



Цитата(popeye @ Dec 9 2007, 18:57) *
А что Вас удивляет в пункте 1?

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


Если я возьму 2-ой, 4-ый и 8-ой элементы вектора b то с вектором a оно не сложится по причине разной длины векторов.
если же я беру 4 элемент два раза - тогда что то может быть.
но! я прошу сложить мне с такими индексами, а не поиграться с ними.
Я понимаю что так легче программировать smile.gif - и это типо не баг, а свойство. Но свойство достаточно не ожиданное - при общепринятом понимании индексного обращения к элементам вектора.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 00:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016