2014 dxdy logo

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

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




 
 вставка нового элемента в вектор [matlab]
Сообщение10.04.2014, 11:05 
Здравствуйте уважаемые участники форума. Подскажите пожалуйста, есть ли в matlab стандартная функция вставки нового элемента в вектор на заданную позицию. Заранее спасибо.

 
 
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 11:56 
Аватара пользователя
Такую функцию не встречал, но что мешает написать ее самому?

 
 
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 12:54 
Ну сам я ее написал, но из-за огромности этих векторов и их количества медленно работает вся программа, поскольку там идет пробег по двух индексам двух циклов. Вот только экономия времени и вынудила меня искать стандартную аналогичную функцию, поскольку стандартные всегда работают экономнее самописных. Ну все равно спасибо. Хотя возможно кто-то другой может встречал?

 
 
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 13:50 
volchenok в сообщении #847918 писал(а):
поскольку там идет пробег по двух индексам двух циклов.
Ну используйте (хотя бы для внутреннего) "встроенный" цикл типа

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

 
 
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 13:56 
О спасибо. Только может быть length поменять на end?

 
 
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 13:57 
Код:
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 
_Ivana в сообщении #847942 писал(а):
если вы вначале объявите массив некоторой стартовой длины, а потом будете увеличивать его длину, то это будет работать гораздо медленнее, чем если вы сразу объявите его нужной длины,

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

 
 
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 14:26 
В общем случае судить не берусь, конечно это зависит от, но по моему опыту это сокращало время на порядки. Текущий размер массива - одна переменная.

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

 
 
 
 Re: вставка нового элемента в вектор
Сообщение10.04.2014, 16:13 
_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 
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 
_Ivana в сообщении #848148 писал(а):
Код:
N = 200000;
a = zeros(N, 1);
for ii = 1:N
    a(ii) = 1;
end
-- 0 (ноль) секунд.

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

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group