Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
6 / 3 / 0
Регистрация: 22.01.2012
Сообщений: 61
1

Модифицировать матрицу

20.01.2015, 00:10. Показов 669. Ответов 2
Метки нет (Все метки)

Здравствуйте! Возникла такая задача: необходимо модифицировать 3х узловые конечные элементы до 6-узловых. Имеются матрицы из Pdetools (p,e,t). Матрицы p,e модифицировал без проблем, а вот матрицу t моя программа очень долго считает. Во вложении привёл схему: что представляет собой матрица t и что мне нужно получить (на примере).
Вот такую программу я написал:
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
% Формируем массив всех граней треугольных элементов.
sides = []; 
for i=1:size(t, 2)
    sides = [ sides, sort([t(1,i); t(2,i)]), sort([t(2,i); t(3,i)]), sort([t(3,i); t(1,i)])  ];
end
 
% Определяем номера одинаковых граней в массиве sides.
symm = [];
k=1;
for i=1:size(sides,2)
    for j=i:size(sides,2)
        if(i ~= j & sides(1, i) == sides(1, j) & sides(2, i) == sides(2, j) )
            symm(1,k) = i;
            symm(2,k) = j;
            k = k + 1;
        end
    end
end
 
% Формируем массив номеров для новых узловых точек.
numbers = [];
for i=1:size(sides,2)
    if(indexOf(symm(2,:), i) ~= -1)
        ind = indexOf(symm(2,:), i);
        numbers(end+1) = numbers(symm(1,ind));
        continue;
    end
    numbers(end+1) = N+i;
end 
 
% Функция indexOf(A, b) - это функция поиска значения b в массиве A. Возвращает порядковые индексы всех 
% вхождений b в массиве, а если такого значения нет, то возвращает -1. Аналог одноимённой функции из JavaScript
Matlab M
1
2
3
4
5
6
7
8
9
function [ind] = indexOf(A, el)
    inds = find(A == el);
    n = length(inds);
    if(isempty(inds))
        ind = -1;
    else
        ind = inds;     
    end
end
Эта программа выдаёт верные значения, но если, например, взять 90 000 элементов, то по времени выходит ~20 минут. А ведь это только небольшая часть всей программы. По хорошему надо взять ещё больше элементов, но боюсь тогда вообще не посчитает. Можно ли как-то ускорить этот процесс? Мб я плохой алгоритм написал...
0
Миниатюры
Модифицировать матрицу  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2015, 00:10
Ответы с готовыми решениями:

Модифицировать до трапецивидного вида
Всем здравствуйте. Обращаюсь к вам за помощью, т.к. самостоятельно не получилось это выполнить. В...

Как сформировать матрицу, чтобы эту матрицу читала функция?
Как сформировать матрицу t, что бы эту матрицу читала ф-ция surf(). Спасибо!!! clear, clc; N...

Создать единичную матрицу и матрицу единиц данного размера
Создать единичную матрицу и матрицу единиц данного размера. При чем использовать функции матлаба...

Модифицировать скрипт
Имеется задача Создать интерактивную программу на shell, которая выводит список действий с номерами...

2
2404 / 1807 / 397
Регистрация: 15.12.2013
Сообщений: 7,776
20.01.2015, 00:33 2
Цитата Сообщение от ZondArt Посмотреть сообщение
Эта программа выдаёт верные значения, но если, например, взять 90 000 элементов, то по времени выходит ~20 минут.
А вы замеряли в какой части программы вычисления происходят медленно?Для начала может избавитесь от вызова функции,не знаю как в Matlab,а в C++ до сих пор такие функции объявляют inline.

P.S. Можно увидеть код части программы,который можно будет запустить?Задача интересная,будет любопытно разобраться в решении.
0
6 / 3 / 0
Регистрация: 22.01.2012
Сообщений: 61
20.01.2015, 13:25  [ТС] 3
Цитата Сообщение от S_el Посмотреть сообщение
А вы замеряли в какой части программы вычисления происходят медленно?
Замерил, там где идёт вложенный цикл (% Определяем номера одинаковых граней в массиве sides.) дольше всего считает, но с увеличением числа элементов - следующий цикл (% Формируем массив номеров для новых узловых точек.) догоняет его по времени. Я сегодня ещё немного улучшил программу, добавил выход из цикла (break, но сильно это не помогло.
Цитата Сообщение от S_el Посмотреть сообщение
Для начала может избавитесь от вызова функции,не знаю как в Matlab,а в C++ до сих пор такие функции объявляют inline.
Тут я вас не понял, а что значит inline?
Цитата Сообщение от S_el Посмотреть сообщение
P.S. Можно увидеть код части программы,который можно будет запустить?Задача интересная,будет любопытно разобраться в решении.
Добавил во вложении. Там параметр hmax - влияет на число конечных элементов:
[t1, sides, symm, numbers] = modPET2(0.005); — это 3600 элементов; Быстро считает.
[t1, sides, symm, numbers] = modPET2(0.001); — 90 000 элементов; У меня минут 20 выходит.
В программу я ещё добавил tic;...toc; - они как раз время замеряют.
0
Вложения
Тип файла: rar Prog.rar (1.1 Кб, 3 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2015, 13:25

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Модифицировать Xpath
Всем доброго времени суток! В Windows есть такая штука называется журнал событий Windows. Так вот...

Модифицировать строку
Есть строка str. Как добавить в конец строки str, строку str1, так чтобы строка str стала "foobar"?...

Модифицировать батник
День добрый. Есть такой батник: @echo off set source="D:\Source" set destination="D:\Last"...

Как модифицировать
Хочу улучшить производительность компа, в основном для игр, вот характеристики: Мать- Gigabyte...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.