2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 вставка нового элемента в вектор [matlab]
Сообщение10.04.2014, 11:05 


21/07/09
300
Здравствуйте уважаемые участники форума. Подскажите пожалуйста, есть ли в matlab стандартная функция вставки нового элемента в вектор на заданную позицию. Заранее спасибо.

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 11:56 
Заслуженный участник
Аватара пользователя


11/04/08
2748
Физтех
Такую функцию не встречал, но что мешает написать ее самому?

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 12:54 


21/07/09
300
Ну сам я ее написал, но из-за огромности этих векторов и их количества медленно работает вся программа, поскольку там идет пробег по двух индексам двух циклов. Вот только экономия времени и вынудила меня искать стандартную аналогичную функцию, поскольку стандартные всегда работают экономнее самописных. Ну все равно спасибо. Хотя возможно кто-то другой может встречал?

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 13:50 
Заслуженный участник


11/05/08
32166
volchenok в сообщении #847918 писал(а):
поскольку там идет пробег по двух индексам двух циклов.
Ну используйте (хотя бы для внутреннего) "встроенный" цикл типа

Используется синтаксис Matlab M
y=[x(1:i-1), a, x(i:length(x))]

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 13:56 


21/07/09
300
О спасибо. Только может быть length поменять на end?

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 13:57 


05/09/12
2587
Код:
a = zeros(1, 5)
a = [a(1:3), 1, a(4:numel(a))]
a = [a(1:2), 5, a(3:numel(a))]

Читайте хелп Матлаба Геттинг стартед - для начинающих. Там описаны операции с массивами и сказано, что не надо делать циклы, когда этого можно избежать - это сильно замедляет скорость. Также там сказано, что если вы вначале объявите массив некоторой стартовой длины, а потом будете увеличивать его длину, то это будет работать гораздо медленнее, чем если вы сразу объявите его нужной длины, потому что в первом случае будут тратиться ресурсы системы на перераспределение памяти и размещения в ней постоянно увеличивающегося массива.

ЗЫ опять долго набираю - уже успевают несколько ответов написать...

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 14:17 
Заслуженный участник


11/05/08
32166
_Ivana в сообщении #847942 писал(а):
если вы вначале объявите массив некоторой стартовой длины, а потом будете увеличивать его длину, то это будет работать гораздо медленнее, чем если вы сразу объявите его нужной длины,

Это да, но только если время и впрямь поджимает; а так -- придётся отдельно хранить текущие размеры массива. Пустячок, но противно. И потом не уверен, что именно "гораздо"; всё-таки выделение памяти -- не такая уж и трудоёмкая операция.

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 14:26 


05/09/12
2587
В общем случае судить не берусь, конечно это зависит от, но по моему опыту это сокращало время на порядки. Текущий размер массива - одна переменная.

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 14:51 


21/07/09
300
Спасибо большое всем.

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 16:13 
Заслуженный участник


11/05/08
32166
_Ivana в сообщении #847950 писал(а):
по моему опыту это сокращало время на порядки. Текущий размер массива - одна переменная.

Насчёт одной переменной: тут дело не в оптимизации счёта, а в том, что каждая лишняя переменная загромождает код. И если время счёта не слишком критично, то компактность кода оказывается гораздо важнее. Насчёт времени -- я тут провёл простенький эксперимент: многократная вставка случайного числа в середину текущего массива (заодно и собственно Матлаб установил, а то всё руки не доходили). Как и ожидалось, раздвижение "физического" массива заметно тормозит счёт; заметно, но -- не фатально. Вот этот код:

Используется синтаксис Matlab M
x=0:200000;
n=3;
for i=1:100000
    x(round(n/2)+1:n+1)=x(round(n/2):n);
    x(round(n/2))=rand;
    n=n+1;
end

-- выполнился секунд за 15-16. А этот:

Используется синтаксис Matlab M
x=0:2;
for i=1:100000
    x=[x(1:round(length(x)/2)-1), rand, x(round(length(x)/2):length(x))];
end

-- секунд за 39-40. В общем, замедление раза в два с половиной; не так уж и смертельно, и уж во всяком случае не на порядки.

-- Чт апр 10, 2014 17:34:28 --

Пардон, я маленько зазевался. Второй код -- не полный аналог первого (это потому, что я первый сочинял после второго). Полным аналогом будет такой:

Используется синтаксис Matlab M
x=0:2;
for i=1:100000
    x(round(length(x)/2)+1:length(x)+1)=x(round(length(x)/2):length(x));
    x(round(length(x)/2))=rand;
end

И он выполняется за примерно 32 секунды. Ну тем более.

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 22:06 


05/09/12
2587
ewert, а теперь мои примеры, ваши двести тысяч:
Код:
N = 200000;
a = zeros(N, 1);
for ii = 1:N
    a(ii) = 1;
end
-- 0 (ноль) секунд.
Код:
N = 200000;
a = [];
for ii = 1:N
    a = [a; 1];
end
-- 53 секунды.
Не смертельно, конечно, но разница гораздо больше, чем на порядки.

 Профиль  
                  
 
 Re: вставка нового элемента в вектор
Сообщение11.04.2014, 09:08 
Заслуженный участник


11/05/08
32166
_Ivana в сообщении #848148 писал(а):
Код:
N = 200000;
a = zeros(N, 1);
for ii = 1:N
    a(ii) = 1;
end
-- 0 (ноль) секунд.

Замечательно. А теперь повторите этот цикл сто тысяч раз.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group