Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 17.10.2013
Сообщений: 10

Как векторизацией задать случайный вектор

13.11.2013, 22:48. Показов 8523. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Хочу получить вектор из 100 случайных чисел. Каждое случайное число должно быть произведением двух нормально распределенных чисел. Так же хочу для скорости сделать это через векторизацию.
Пробую вот так:
r=1:R;
MM(1,r)=randn*randn;
Но получаю вектор в котором R штук одинаковых чисел. Как сделать так что бы при вычислении очередного элемента randn менял значение которое выдает, причем так что бы умножились два разных нормально распределенных числа?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2013, 22:48
Ответы с готовыми решениями:

Как задать случайный цвет фигуре
Надо чтобы фигура меняла цвет(рандомно) по таймеру Dim R As Integer, G As Integer, B As Integer Randomize() R=Rnd(255) ...

Пусть Х - случайный вектор с распределением F
Помогите, пожалуйста, решить задачу

Как задать вектор-столбец
Необходимо задать вектор столбец, с значениями от 5000 до 50000000 с шагом 1. Делаю в строку, а в столбец что-то не получается. Спасибо всем

14
319 / 258 / 30
Регистрация: 30.03.2013
Сообщений: 755
14.11.2013, 00:41
Создание вектора из 100 чисел не требует векторизации, вы выигрыш по времени НЕ сможете зафиксировать
0
0 / 0 / 0
Регистрация: 17.10.2013
Сообщений: 10
14.11.2013, 01:35  [ТС]
Почему не смогу? В начале tic потом toc
0
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
14.11.2013, 10:06
Вот примерно то, о чём говорится. Но, как подметил sergsh, с такими маленькими векторами выигрыша во времени мы не увидим. Только я бы посоветовал всегда пользоваться матричной магией, если есть возможность.
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
clear all; close all
tic
 
x1 = randn(100,1);
x2 = randn(100,1);
Vector1 = x1.*x2;
 
Time_elapsed1 = toc;
 
tic
 
for i = 1:100
    Vector2(i,1) = randn(1)*randn(1);
end
 
Time_elapsed2 = toc;
1
0 / 0 / 0
Регистрация: 17.10.2013
Сообщений: 10
14.11.2013, 16:30  [ТС]
lomt, спасибо за ответ. Нечто подобное было у меня в голове. Но мне казалось, что если должным образом задать аргументы в скобках randn(), то он будет менять свое значения и в:
r=1:R;
MM(1,r)=randn*randn;

Либо я не совсем понял что такое векторизация, и тогда прошу наставить меня на путь истинный)))

Добавлено через 11 минут
Вот например, мне не удается отнормировать на 1 все столбцы произвольной матрицы М без использования цикла. Мне казалось что можно было без цикла, используя лишь векторизацию перемножить каждый столбец матрицы М, на соответствующий элемент матрицы 1/.sum(M). Вопрос это вообще можно сделать с помощью векторизации?
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
14.11.2013, 16:50
Цитата Сообщение от Tigran-aminator Посмотреть сообщение
Вот например, мне не удается отнормировать на 1 все столбцы произвольной матрицы М без использования цикла. Мне казалось что можно было без цикла, используя лишь векторизацию перемножить каждый столбец матрицы М, на соответствующий элемент матрицы 1/.sum(M). Вопрос это вообще можно сделать с помощью векторизации?
Пусть у тебя есть матрица из двух столбцов М, тогда s=1/.sum(M) - это вектор из двух элементов - сумм элементов каждого столбца. Для нормировки, нужно каждый столбец поделить на соответствующих элемент, но влоб поделить матрицу на вектор не получится, т.к. размерности разные, вот если бы мы этот вектор размножили под размер матрицы!... для этого можно использовать матричную магию: умножить вектор столбец из единичек (длинны одного столбца) на вектор строку сумм и получим то что надо, вот пример:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
>> M = rand(5,2) % матрица случ. чисел
 
M =
    0.7513    0.9593
    0.2551    0.5472
    0.5060    0.1386
    0.6991    0.1493
    0.8909    0.2575
 
>> s = sum(M) % вектор сумм
 
s =
    3.1023    2.0519
 
>> Z = ones(size(M,1),1)*s  % вспомогательная матрица
 
Z =
    3.1023    2.0519
    3.1023    2.0519
    3.1023    2.0519
    3.1023    2.0519
    3.1023    2.0519
 
>> Mn = M./Z % нормируем
 
Mn =
    0.2422    0.4675
    0.0822    0.2667
    0.1631    0.0676
    0.2253    0.0728
    0.2872    0.1255
 
>> sum(Mn) % проверка
 
ans =
     1     1
*эх, пнул бы кто меня написать статейку по матричной магии очень полезная штука
2
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
14.11.2013, 17:03
Вот так самый кратчайший путь:
Matlab M
1
Vect = randn(100,1).*randn(100,1);
Твой вариант реализует запись во всю строку массива одинакового числа, равного произведению двух случайных чисел. В этом случаи ты никак не заменяешь цикл матричной математикой, randn считается единожды и всё элементы одинаковые.
Вот пример векторизации, когда мы заменяем цикл:
Matlab M
1
2
t=0:.002:12;
Sig = sin(2.*pi.*20.*t);
вместо цикла:
Matlab M
1
2
3
4
t = 0:.002:10;
for i = 1:length(t)
    Sig(i) = sin(2.*pi.*20.*t(i);
end
Добавлено через 2 минуты

Не по теме:

Опоздание)))) Но у тебя, Зосима, это уже матричная математика. А вот векторизацию именно скорее мой пример описывает. Хотя конечно это частный случай

0
14.11.2013, 17:23

Не по теме:

lomt, ну я сконцентрировал свои усилия не столько на векторизации, сколько на нормировке столбцов :)

0
14.11.2013, 17:29

Не по теме:

ну это я понял;)

0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
14.11.2013, 17:35
кстать, я еще чуток упрлс0:

Matlab M
MM = prod( randn(2,R) ); % произведение пар столбцов
1
0 / 0 / 0
Регистрация: 17.10.2013
Сообщений: 10
14.11.2013, 17:44  [ТС]
Зосима, мне кажется, статья про матричную "магию", в видном месте, была бы очень популярной и нужной. Можно позволять пользователям дискутировать там и добавлять свои варианты матричной и простой реализации кода, например, данная задачка про нормировку поучительна. Так потихоньку будет большой массив информации.
0
 Аватар для lomt
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
14.11.2013, 17:47
Цитата Сообщение от Зосима Посмотреть сообщение
кстать, я еще чуток упрлс0:
Код Matlab M
MM = prod( randn(2,R) ); % произведение пар столбцов

Не по теме:

эээхххх люблю я это дело)))

0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
14.11.2013, 17:49
Tigran-aminator, у меня в закладках есть также парочка очень интересных приемов матричной и матрично-логарифмической магии:
Посчитать все возможные расстояния между точками в каждом кадре.
Заполнить массив по правилу
Вычислить слагаемые, используя две функции
но написать статью - руки не доходят
0
319 / 258 / 30
Регистрация: 30.03.2013
Сообщений: 755
14.11.2013, 18:59
Зосима, я идею отдельного топика по векторным решениям тоже поддерживаю.
0
0 / 0 / 0
Регистрация: 17.10.2013
Сообщений: 10
14.11.2013, 23:40  [ТС]
Зосима, "матрично-логарифмическая магия" - нужно запотентовать технологию
Посчитать все возможные расстояния между точками в каждом кадре. - по мотивам данного диалога я написал код
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
clear all
clc
n=1000000; % варируемый параметр 
objects=10;% варируемый параметр 
X=rand(n,objects);
Y=2 + rand(n,objects);
tic
R1=zeros(objects,objects,n);% варируемый параметр нужно ли заранее определять матрицу 
for i = 1:n % пробегаем по строкам
    x = X(i,:); 
    y = Y(i,:);
    dx1 = log(exp(x)'*exp(-x));
    dy1 = log(exp(y)'*exp(-y));
    R1(:,:,i) = sqrt(dx1.^2 + dy1.^2);
end
eexp=toc;% время матричной операции
 
tic
dx2=zeros(objects);  % варируемый параметр нужно ли заранее определять матрицу 
dy2=zeros(objects);% варируемый параметр нужно ли заранее определять матрицу 
R2=zeros(objects,objects,n);% варируемый параметр нужно ли заранее определять матрицу 
for i = 1:n % пробегаем по строкам
   for j=1:objects
       for k=1:objects
        dx2(j,k)= X(i,j)-X(i,k);
        dy2(j,k) = Y(i,j)-Y(i,k);
       end
   end
   R2(:,:,i) = sqrt(dx2.^2 + dy2.^2);
end
prosto=toc; % время обычной операции
boost=prosto/eexp % отношение матричного времени к обычному
total_time=prosto+eexp % сумма двух времен
Поиграв с параметрами и тем нужно ли заранее определять матрицы, у меня получилось что обычный вариант лучше матричного, при некоторых комбинациях матричная реализация была лучше, но на 10%.
Возможно, экспонента слишком ресурсоемкая операция.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2013, 23:40
Помогаю со студенческими работами здесь

Как задать двумерный вектор?
Как задать двумерный вектор, вводить в него элементы и обращаться к ним?

Задать случайный цвет окна
цикл с постусловием. С клавиатуры вводятся последовательно целые числа x, y, m, n, которые определяют координаты левой верхней и...

Сформировать случайный вектор и найти характеристики
Здравствуйте, подскажите, пожалуйста, в чём ошибка Необходимо сформировать случайный вектор, значение которого зависит от параметра,...

Сделать случайный УПОРЯДОЧЕННЫЙ массив (вектор)
Вот задачка, сделать случайный УПОРЯДОЧЕННЫЙ массив (вектор), желательно с настраивыемыми параметрами : число элементов, убывание или...

Как задать вектор из функции find
Всем привет, такой вопрос. Есть параметр, который будет изменяться 20 раз и есть 36 коэффициентов, которые находятся из 36-ти уравнений...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru