2014 dxdy logo

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

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




 
 Трансляция с языка Matlab на Python
Сообщение30.03.2014, 20:19 
Ребята, есть следующий кусок кода на матлабе, нужно написать его на питоне, который я знаю очень плохо,но обязательно надо написать и именно на питоне. Проблема в том, что я не могу передать массив в аргумент функции (в питоне) в цикле, а в матлабе это автоматически делается- незнаю, как это сделать и незнаю возможности питона.
Код:
цикл

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 
На С++ есть перегрузка операторов, с помощью неё можно решить эту проблему, но как это сделать на питоне?

 
 
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 06:03 
Код:
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 
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 
Есть библиотека NumPy.
http://wiki.scipy.org/Tentative_NumPy_Tutorial

 
 
 
 Re: Трансляция с языка Matlab на Python
Сообщение02.04.2014, 10:55 
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 
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 
Держите пару ссылок про массивы на питоне, больше ничем помочь не могу.
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 
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 
И всё-таки, уважаемые пользователи сайта dxdy, можно ли передать массив в аргумент функции в python, как в матлабе, чтобы реализовать тот случай, который я описал выше.

 
 
 
 Re: Трансляция с языка Matlab на Python
Сообщение04.04.2014, 17:09 
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
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 ] 


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