Перейти к содержанию
    

индексные операции в Matlab.

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

 

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;

но я же прошу просуммировать - и в результате как то не правильно.

 

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

 

Подскажите где не правильно пошла моя мысль?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сам был удивлен!

Могу лишь сделать предположение, что при выполненни операции результат хранится во временном массиве и переносится в 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 читал не много, да и пользуюсь им не часто...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Вы берете 2-ой, 4-ый и 8-ой элементы вектора b (нули) и складываете с вектором a, результатом чего является вектор [1 2 3 4], а потом делаете присваивание выбранным элементам. 4-ый элемент получает значение дважды, поэтому значение 2 перезаписывается тройкой. Всё правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Если я возьму 2-ой, 4-ый и 8-ой элементы вектора b то с вектором a оно не сложится по причине разной длины векторов.

если же я беру 4 элемент два раза - тогда что то может быть.

но! я прошу сложить мне с такими индексами, а не поиграться с ними.

Я понимаю что так легче программировать :) - и это типо не баг, а свойство. Но свойство достаточно не ожиданное - при общепринятом понимании индексного обращения к элементам вектора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...