小编Zac*_*ack的帖子

3个函数的中位数比较数?

到目前为止,我的函数找到3个数字的中位数并对它们进行排序,但它总是进行三次比较.我想我可以在某处使用嵌套的if语句,这样有时我的函数只会进行两次比较.

int median_of_3(int list[], int p, int r)
{
    int median = (p + r) / 2;

    if(list[p] > list[r])
        exchange(list, p, r);
    if(list[p] > list[median])
        exchange(list, p, median);
    if(list[r] > list[median])
        exchange(list, r, median);

    comparisons+=3;                // 3 comparisons for each call to median_of_3

    return list[r];
}
Run Code Online (Sandbox Code Playgroud)

我不确定我在哪里可以看到嵌套的if语句.

c++ algorithm median

9
推荐指数
2
解决办法
1万
查看次数

Cython代码比Python/Numpy代码慢3-4倍?

我试图将我的Python/Numpy代码转换为Cython代码以加速.但是,Cython比Python/Numpy代码慢很多(3-4倍).我正确使用Cython吗?我在Cython代码中正确地将参数传递给myc_rb_etc()吗?当我调用集成函数时呢?预先感谢您的帮助.这是我的Python/Numpy代码:

from pylab import * 
import pylab as pl
from numpy import *
import numpy as np
from scipy import integrate

def myc_rb_e2f(y,t,k,d):

    M = y[0]
    E = y[1]
    CD = y[2]
    CE = y[3]
    R = y[4]
    RP = y[5] 
    RE = y[6]

    S = 0.01
    if t > 300:
        S = 5.0
    #if t > 400
        #S = 0.01

    t1 = k[0]*S/(k[7]+S);
    t2 = k[1]*(M/(k[14]+M))*(E/(k[15]+E));
    t3 = k[5]*M/(k[14]+M);
    t4 = k[11]*CD*RE/(k[16]+RE);
    t5 = k[12]*CE*RE/(k[17]+RE);
    t6 = k[2]*M/(k[14]+M);
    t7 …
Run Code Online (Sandbox Code Playgroud)

python performance numpy cython scipy

6
推荐指数
1
解决办法
1939
查看次数

通过Scipy&Numpy使用Python将数据拟合到ODE系统

我在通过Scipy&Numpy将我的MATLAB代码翻译成Python时遇到了一些麻烦.我坚持如何找到我的ODE系统的最佳参数值(k0和k1),以适应我的十个观察数据点.我目前对k0和k1有一个初步猜测.在MATLAB中,我可以使用一种叫做"fminsearch"的东西,它是一个接受ODE系统,观察数据点和ODE系统初始值的函数.然后,它将计算一对新的参数k0和k1,它们将适合观察到的数据.我已经包含了我的代码,看看你是否可以帮助我实现某种"fminsearch"来找到适合我数据的最佳参数值k0和k1.我想将任何代码添加到我的lsqtest.py文件中.

我有三个.py文件 - ode.py,lsq.py和lsqtest.py

ode.py:

def f(y, t, k): 
return (-k[0]*y[0],
      k[0]*y[0]-k[1]*y[1],
      k[1]*y[1])
Run Code Online (Sandbox Code Playgroud)

lsq.py:

import pylab as py
import numpy as np
from scipy import integrate
from scipy import optimize
import ode
def lsq(teta,y0,data):
    #INPUT teta, the unknowns k0,k1
    # data, observed 
    # y0 initial values needed by the ODE
    #OUTPUT lsq value

    t = np.linspace(0,9,10)
    y_obs = data #data points
    k = [0,0]
    k[0] = teta[0]
    k[1] = teta[1]

    #call the ODE solver to get the states:
    r = …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy data-fitting differential-equations

5
推荐指数
3
解决办法
6364
查看次数

如何在 Numpy 中矢量化这个 double for 循环?

我有一些运行缓慢的 Python/Numpy 代码,我认为这是因为使用了双循环。这是代码。

def heat(D,u0,q,tdim):
    xdim = np.size(u0)
    Z = np.zeros([xdim,tdim])
    Z[:,0]=u0;
    for i in range(1,tdim):
        for j in range (1,xdim-1):
            Z[j,i]=Z[j,i-1]+D*q*(Z[j-1,i-1]-2*Z[j,i-1]+Z[j+1,i-1])
    return Z
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除双 for 循环并将 Z 向量化。这是我的尝试。

def heat(D,u0,q,tdim):
    xdim = np.size(u0)
    Z = np.zeros([xdim,tdim])
    Z[:,0]=u0;
    Z[1:,1:-1]=Z[1:-1,:-1]+D*q*(Z[:-2,:-1]-2*Z[1:-1,:-1]+Z[2:,:-1])
    return Z
Run Code Online (Sandbox Code Playgroud)

这不起作用 - 我收到以下错误:

operands could not be broadcast together with shapes (24,73) (23,74)
Run Code Online (Sandbox Code Playgroud)

所以在尝试矢量化 Z 的某个地方,我搞砸了。你能帮我找出我的错误吗?

python numpy vectorization

5
推荐指数
1
解决办法
451
查看次数

在MATLAB中生成对数正态随机数?

我正在尝试生成从对数正态分布中获取的10000个随机数,其相关的正态分布具有均值= 0.3和std.开发.在MATLAB中= 0.05.

我正在使用内置lognrnd功能.

我的尝试是:

R = lognrnd(0.3,0.05,10000,1)

然而,当我绘制的直方图R使用hist(R),相关的情节是正常的,不正常的日志.

我搞砸了哪里?如果平均值= 0.3和标准.开发.= 0.05的正态分布,不应该生成的对数正态数具有均值= 0.3和std.dev = 0.05?

多谢你们.

matlab

5
推荐指数
1
解决办法
3611
查看次数

最长公共子序列长度函数没有返回正确的长度?

我试图实现动态编程方法来找到两个序列之间的最长公共子序列。当被比较的两个字符串长度相同时,我的算法有效,但是当第二个字符串比第一个字符串长时,我的LCSLength()函数不会返回正确的值。

这是带有返回错误值的测试用例的代码。

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int LCSLength(string X,string Y);

int main()
{
    string first ("HELLO");
    string second ("HLOCKKE");
    int LCS;

    //ifstream inData;
    //inData.open("test.dat");

    //inData >> first >> second;
    //inData.close();

    LCS = LCSLength(first,second);
    cout << "The LCS is: " << LCS << endl;
    cout << first << endl;
    cout << second << endl;
    return 0;
}

int LCSLength(string X,string Y)
{
    int m = X.size();
    int n = Y.size();
    int C[m][n];
    for(int i=0; …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm

3
推荐指数
1
解决办法
7995
查看次数

插入排序不排序第一个元素?

我对插入排序的实现似乎是在排序第一个元素的例外.我这里有一个小测试用例.谁能告诉我算法有什么问题?

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;



void Insert(int *S, int k)
{
        int key = S[k];
        int j = k-1;
        while(j>0 && S[j] > key)
        {
                S[j+1] = S[j];
                j--;
        }

        S[j+1] = key;
}


void Insertionsort(int S[], int n)
{
        if(n>1)
                Insertionsort(S,n-1);
        Insert(S,n);

}

int main()
{
        srand ( time(NULL) );
        int S1_8[8];
        for(int i=0; i<8; i++)
                S1_8[i] = rand()%100;

        Insertionsort(S1_8,8);

        for(int i=0; i<8; i++)
        {
                cout << S1_8[i] << endl;
        }

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ algorithm insertion-sort

2
推荐指数
1
解决办法
1237
查看次数

将Python/Numpy代码转换为Cython - 数组问题 - 缓冲区类型只允许作为函数局部变量?

我试图将一些Python/Numpy代码转换为Cython以加快速度.这是我的代码:

cimport numpy as np
import numpy as np
from numpy import *
import pylab as pl
from pylab import * 
from scipy import integrate

def myc_rb_e2f(np.ndarray[double,ndim=1] y = np.zeros(7),double t, double k,double d):

    M = y[0]
    E = y[1]
    CD = y[2]
    CE = y[3]
    R = y[4]
    RP = y[5] 
    RE = y[6]

    cdef double S = 0.01
    if t > 300.0:
        S = 5.0
    #if t > 400
        #S = 0.01

    cdef double t1 = k[0]*S/(k[7]+S)
    cdef …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy cython

1
推荐指数
1
解决办法
1498
查看次数

MATLAB中的矩阵尺寸误差

已经很晚了 - 我无法找到我的错误在我的error功能中.我正在尝试参数估计.

function value = lv(t,y,p)
    %Lotka-Volterra Model
    %p(1)=a, p(2) = b, p(3) = c, p(4) = r.
    value = [-p(1)*y(1)-p(2)*y(1)*y(2);-p(4)*y(2)+p(3)*y(1)*y(2)];
end

function error = lverr(p)
    %LVERR: Function defining error function for
    %example with Lotka-Volterra equations.
    H = [30.0 47.2 70.2 77.4 36.3 20.6 18.1 21.4 22 25.4 27.1];
    L = [4 6.1 9.8 35.2 59.4 41.7 19 13 8.3 9.1 7.4];

    [t,y] = ode45(@lv,[0 10],[H(1);L(1)],[],p);
    value = (y(:,1)-H').^2+(y(:,2)-L').^2;
    %Primes transpose data vectors H and L
    error …
Run Code Online (Sandbox Code Playgroud)

parameters matlab

1
推荐指数
1
解决办法
767
查看次数

为什么这两个版本的quicksort在比较次数上产生了巨大的差异?

我在下面有两个不同的快速排序实现.我已经验证了这些版本的quicksort工作的意义,他们将对我正确给出的任何数组进行排序.如果您注意到(至少在我看来),当阵列大小n大于8 时,版本#2与版本#1完全相同.因此,我希望当我给这两个函数提供相同的数组时如果大小大于8,它们应该平均进行相同数量的组件比较,但它们不会.

对于n > 8,功能使用sort3()partition()功能.我已经列出了以下内容,以向您展示我如何计算组件明智比较的数量.

我知道,W(n)这些快速排序实现的理论最坏情况比较是(n(n + 2)/ 4)+8.因此,对于数组大小n = 500,W(n) = 62758.对于大小数组的测试运行n = 500,版本#1平均进行大约5000次比较,这是合理的.但是,版本#2平均进行80000次比较.显然这不是正确的 - 版本#2正在进行比理论更多的比较,W(n)并且它与(版本#1)完全相同(至少在我看来).

您是否看到我在版本#2中出现的错误?

版本#1:

void Quicksort_M3(int S[], int low, int hi)
{
    if(low < hi)
    {
        if((low+1) == hi)
        {
            comparisons++;
            if(S[low] > S[hi])
                swap(S[low],S[hi]);
        }
        else
        {
            Sort3(S,low,hi);
            if((low+2)<hi)
            {
                swap(S[low+1],S[(low+hi)/2]);
                int q = partition(S, low+1, hi-1);
                Quicksort_M3(S, low, q-1);
                Quicksort_M3(S, q+1, hi);
            }
        }
    } …
Run Code Online (Sandbox Code Playgroud)

c++ sorting algorithm quicksort

0
推荐指数
1
解决办法
322
查看次数