2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Трансляция с языка Matlab на Python
Сообщение30.03.2014, 20:19 


30/03/14
12
Ребята, есть следующий кусок кода на матлабе, нужно написать его на питоне, который я знаю очень плохо,но обязательно надо написать и именно на питоне. Проблема в том, что я не могу передать массив в аргумент функции (в питоне) в цикле, а в матлабе это автоматически делается- незнаю, как это сделать и незнаю возможности питона.
Код:
цикл

for k=1:30
    for l=1:30
        F=F+(fun(X,Y, x1(k), y1(l), sigm)+fun(X,Y, x2(k), y2(l), sigm)); 
    end
end

функция

fun = @(x,y, x0,y0, sigm) 2000/(2*pi*sigm^2)*exp(-((x-x0).^2+(y-y0).^2)/(2*sigm^2));


где, x1,y1,x2,y2 - векторы длинной в 30 элементов.
X,Y,F - массивы 512 на 512 элементов.
sigm - просто число


Прошу, подскажите как решить эту проблему? Понятно, что умный матлаб на каждом шаге итерации k и l прибавляет сразу весь массив F, в питоне естественно это не работает.

 Профиль  
                  
 
 Re: Трансляция с языка Matlaо яb на Python
Сообщение02.04.2014, 00:41 


30/03/14
12
На С++ есть перегрузка операторов, с помощью неё можно решить эту проблему, но как это сделать на питоне?

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 06:03 


23/05/12

1245
Код:
xx1=x1(k);
yy1=y1(l);
xx2=x2(k);
yy2=y2(l);

F=F+(fun(X,Y, xx1, yy1, sigm)+fun(X,Y, xx2, yy2, sigm));

Можно сунуть просто переменные.

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 10:20 


30/03/14
12
Lukum в сообщении #844417 писал(а):
Код:
xx1=x1(k);
yy1=y1(l);
xx2=x2(k);
yy2=y2(l);

F=F+(fun(X,Y, xx1, yy1, sigm)+fun(X,Y, xx2, yy2, sigm));

Можно сунуть просто переменные.

Спасибо, что хотя бы ты ответил, но ты видимо не правильно понял переменные x1,x2,у1,у2 это векторы длиной в 30 элементов они нормально передаются в аргумент функции, проблема с матрицами Х,У они 512 на 512 элементов.Матлаб понимает это и сразу функцию считает от всего массива, в питоне я не знаю как это реализовать.

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 10:37 
Заслуженный участник


31/12/05
1525
Есть библиотека NumPy.
http://wiki.scipy.org/Tentative_NumPy_Tutorial

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 10:55 


23/05/12

1245
sergey.voron
1. тут принято на вы общаться
2. если бы написали, что вы желаете посчитать, то думаю давно бы получили ответ
3.
Код:
fun = @(x,y, x0,y0, sigm) 2000/(2*pi*sigm^2)*exp(-((x-x0).^2+(y-y0).^2)/(2*sigm^2));

я не знаю матлаба, видимо тут следующее
это определение функции с именем "fun"
а это "$2000/(2*pi*sigm^2)*exp(-((x-x0).^2+(y-y0).^2)/(2*sigm^2))$ видимо тело функции т.е. формула расчета
разверните формулу в два цикла и посчитайте эту функцию для каждого элемента массива

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 11:18 


30/03/14
12
Lukum в сообщении #844470 писал(а):
sergey.voron
1. тут принято на вы общаться
2. если бы написали, что вы желаете посчитать, то думаю давно бы получили ответ
3.
Код:
fun = @(x,y, x0,y0, sigm) 2000/(2*pi*sigm^2)*exp(-((x-x0).^2+(y-y0).^2)/(2*sigm^2));

я не знаю матлаба, видимо тут следующее
это определение функции с именем "fun"
а это "$2000/(2*pi*sigm^2)*exp(-((x-x0).^2+(y-y0).^2)/(2*sigm^2))$ видимо тело функции т.е. формула расчета
разверните формулу в два цикла и посчитайте эту функцию для каждого элемента массива

Спасибо за ответ,но добавлять еще дополнительные циклы, скажем по i и l внутри этих двух как минимум не рационально, массивы Большие 512 элементов , я знаю, в питоне тоже есть сильный инструментарий по работе с массивами, хотелось бы реализовать это по аналогии с матлабом. Повторюсь, необходимо передать в цикле в аргумент функции массив.

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 12:01 


23/05/12

1245
Держите пару ссылок про массивы на питоне, больше ничем помочь не могу.
http://koldunov.net/?p=381
http://habrahabr.ru/post/121031/

-- 02.04.2014, 13:09 --

Код:
import numpy as np
ones = np.ones((3,5))
ones
np.sum(ones)

1. импортировали библиотеку
2. создали массив из единиц
3. нашли сумму элементов массива
Изображение

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 12:39 


30/03/14
12
Lukum в сообщении #844484 писал(а):
Держите пару ссылок про массивы на питоне, больше ничем помочь не могу.
http://koldunov.net/?p=381
http://habrahabr.ru/post/121031/

-- 02.04.2014, 13:09 --

Код:
import numpy as np
ones = np.ones((3,5))
ones
np.sum(ones)

1. импортировали библиотеку
2. создали массив из единиц
3. нашли сумму элементов массива
Изображение

Спасибо за рекомендацию, да я именно этим и пользовался),но конкретно как организовать суммирование в цикле не знаю.
P/S С num py я знаком и базовые операции тоже знаю, но питон в цикле пишет ошибку,что он может в аргумент функции интерпретировать только одноименный массив(вектор строка) а не квадратную матрицу.

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение04.04.2014, 12:03 


30/03/14
12
И всё-таки, уважаемые пользователи сайта dxdy, можно ли передать массив в аргумент функции в python, как в матлабе, чтобы реализовать тот случай, который я описал выше.

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение04.04.2014, 17:09 
Заслуженный участник


31/12/05
1525
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import math
from numpy import *

N = 512
M = 30
X = arange(0, N ** 2).reshape(N, N) / 10
Y = arange(N ** 2, 0, -1).reshape(N, N) / 10
x1 = arange(M) / 10
y1 = arange(M, 0, -1) / 10
x2 = arange(1, M + 1) / 10
y2 = arange(M + 1, 1, -1) / 10
sigm = 5000

def fun(x, y, x0, y0, sigm):
    return 2000 / (2 * math.pi * sigm ** 2) * exp(
        -((x - x0) ** 2 + (y - y0) ** 2) / (2 * sigm ** 2))

F = sum(fun(X, Y, x1[k], y1[l], sigm) + fun(X, Y, x2[k], y2[l], sigm)
        for k in range(30) for l in range(30))

 Профиль  
                  
 
 Re: Трансляция с языка Matlab на Python
Сообщение04.04.2014, 17:40 


30/03/14
12
tolstopuz в сообщении #845393 писал(а):
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import math
from numpy import *

N = 512
M = 30
X = arange(0, N ** 2).reshape(N, N) / 10
Y = arange(N ** 2, 0, -1).reshape(N, N) / 10
x1 = arange(M) / 10
y1 = arange(M, 0, -1) / 10
x2 = arange(1, M + 1) / 10
y2 = arange(M + 1, 1, -1) / 10
sigm = 5000

def fun(x, y, x0, y0, sigm):
    return 2000 / (2 * math.pi * sigm ** 2) * exp(
        -((x - x0) ** 2 + (y - y0) ** 2) / (2 * sigm ** 2))

F = sum(fun(X, Y, x1[k], y1[l], sigm) + fun(X, Y, x2[k], y2[l], sigm)
        for k in range(30) for l in range(30))

Большое спасибо, особенно за последнюю строчку, вот это меня именно интересовало. Спасибо ещё раз.
p/s мне не знакомо было выражение вида sum( fun( ) for k in range( ) for l in range( ))

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

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



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

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


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

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