Форум программистов, компьютерный форум, киберфорум
Зосима
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Пример матрично-логико-логарифмической магии

Запись от Зосима размещена 13.05.2014 в 17:57
Показов 3104 Комментарии 0

Благодаря матричной ориентации вычислений в MATLAB некоторые алгоритмы можно реализовать всего в несколько строк!
Пример изящества MATLAB-a.

Задание: "Найти сколько раз числа из массива A встречаются в массиве B"
B = [4 5 1 0 4 2 3 4 2 2 4 0 0 4 0 5 2 3 4 3 5 3 1 2 0 3 3 3 1 0 0 0 0 5 3 0 2 2 4 2];
A = [0 1 2 3 4 5];

В традиционных ЯП эта задача решается при помощи двойного цикла:
Matlab M
1
2
3
4
5
6
7
8
N = zeros(size(A));
for i = 1:length(A) % пробегаем по всем элементам массива А
    for j = 1:length(B) % пробегаем по всем элементам массива В
        if B(j)==A(i) % если элементы равны
            N(i) = N(i) + 1; % увеличиваем счетчик
        end
    end
end
Однако MATLAB позволяет получить результат в одну(!) строку:
Matlab M
1
N = sum( abs( log(exp(B)'*exp(-A)) )<=1e-15 )
которые можно разбить на три действия:
Matlab M
1
2
3
R = log(exp(B)'*exp(-A)); % формируется матрица разностей R(i,j) = B(j)-A(i)
L = abs( R )<=1e-10 % логическая матрица, 1 - там где модуль разности меньше порогового значения
N = sum( L ) % суммы столбцов, они равны искомому количеству
Пояснение по первому действию можно посмотреть тут
Во втором из-за конечной точности вычислений разность равных чисел не всегда строго равна нулю, поэтому приходится сравнивать с порогом.
По третьему - это обработка логических векторов, о которых я уже писал


Если массив А - уникальные элементы массива В, то можно получить вероятности появлений элементов, а также отсортировать их:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
clear, clc
B = randint(1,20,[0 9]) % случайный вектор
A = unique(B) % уникальные элементы
 
% вероятности появления элементов
P = sum( abs( log(exp(B)'*exp(-A)) )<=1e-15 ) / length(B)  
[p ii] = sort(P,'descend'); % сортируем по убыванию
a = A(ii); % модифицируем массив А в соответствии с сортировкой
% отображаем массивы:
a 
p
Думаю не секрет, что таким же макаром можно обрабатывать текст, т.е. массивы кодов ASCII


Также подобное задание: "Найти числа, которые встречаются в массиве ровно 2 раза" можно решить так:
Matlab M
1
2
3
4
5
6
B = randint(1,20,[0 9]) % случайный вектор
A = unique(B) % уникальные элементы
 
% индексы элементов, которые встречаются дважды:
idx = sum( abs( log(exp(B)'*exp(-A)) )<=1e-15 ) == 2; 
z = A(idx) % элементы, которые встречаются дважды

Однако, как показали испытания, затраты времени на обработку матриц при всей заточке матлаба на них, оказались выше, чем для циклов!
(правда может это только на моем тракторе)
Тестовая программа
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
clear, clc
 
n = fix(logspace(2,6,10));
 
for k = 1:length(n)
    % задаем случайные вектора
    x = randint(1,n(k),[0 9]);
    a = unique(x);
    
    % матричный метод
    tic
    N1 = sum( abs( log(exp(x)'*exp(-a)) )<=1e-15 );
    t1(k) = toc;
    
    % цикл
    tic
    N2 = zeros(size(a));
    for i = 1:length(a)
        for j = 1:length(x)
            if x(j)==a(i)
                N2(i) = N2(i) + 1;
            end
        end
    end
    t2(k) = toc;
    
    if any(N1~=N2), disp('Ошибка!'), end % на всякий пожарный
end
 
loglog(n,t1,'r',n,t2,'b','linew',2)
xlabel('Длинна массива В')
ylabel('Время вычислений, с')
grid on
legend('Матричный метод','цикл')
Нажмите на изображение для увеличения
Название: 01F.png
Просмотров: 937
Размер:	13.6 Кб
ID:	2348
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru