我不明白BLAS,LAPACK和ATLAS是如何相关的以及我应该如何一起使用它们!我一直在查看他们的所有手册,我对BLAS和LAPACK以及如何在我找到的极少数示例中使用它们有了一般概念,但我找不到任何使用ATLAS的实际示例来查看它与这两个.
我正在尝试对矩阵做一些低级别的工作,我的主要语言是C.首先我想使用GSL,但它说如果你想要最好的性能,你应该使用BLAS和ATLAS.有没有什么好的网页提供一些很好的例子,说明如何一起使用这些(在C中)?换句话说,我正在寻找使用这三个(或其中任何一个子集!)的教程.总之我很困惑!
在下面的程序中,数组的长度ar在main中是正确的,但是temp它显示了ar我的计算机上指针的长度为2(以单位为单位sizeof(int)).
#include <stdio.h>
void temp(int ar[]) // this could also be declared as `int *ar`
{
printf("%d\n", (int) sizeof(ar)/sizeof(int));
}
int main(void)
{
int ar[]={1,2,3};
printf("%d\n", (int) sizeof(ar)/sizeof(int));
temp(ar);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何定义函数,以便在函数中正确读取数组的长度.
我假设当我们写:(arr[i]相当于*(arr+i))时会发生内部强制转换.因为i例如可以是一个short,int或long或任何这些三个无符号的变体.
所以我的问题很简单:哪种类型应该i不会发生内部转换?这样代码可以最有效地运行?
粗猜:size_t?
我正在scipy.optimize.curve_fit()以迭代的方式使用.
我的问题是,当它无法适应参数时,整个程序(以及迭代)停止,这就是它给出的错误:
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 800.
我明白为什么它无法适应.我的问题是,有什么办法可以在Python 3.2.2中编写程序来忽略这种情况而只是继续吗?
Conda 在保持对包的必要依赖项的控制方面做得很好,但显然大多数包都将 C 库作为可跟踪的依赖项排除在外。例如,让我们使用以下命令安装 Gnuastro:
conda install -c conda-forge gnuastro
Run Code Online (Sandbox Code Playgroud)
然后,我查看 Gnuastro 程序之一链接的库(例如astnoisechisel):
$ ldd $(which astnoisechisel)
linux-vdso.so.1 (0x00007ffdbd336000)
libgnuastro.so.9 => /path/to/conda/install/envs/testenv/bin/../lib/libgnuastro.so.9 (0x00007fe039ce1000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe039b86000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe0399c6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe0399a5000)
libgit2.so.28 => /path/to/conda/install/envs/testenv/bin/../lib/./libgit2.so.28 (0x00007fe039882000)
libtiff.so.5 => /path/to/conda/install/envs/testenv/bin/../lib/./libtiff.so.5 (0x00007fe039800000)
liblzma.so.5 => /path/to/conda/install/envs/testenv/bin/../lib/./liblzma.so.5 (0x00007fe0397d7000)
libjpeg.so.9 => /path/to/conda/install/envs/testenv/bin/../lib/./libjpeg.so.9 (0x00007fe039799000)
libwcs.so.5 => /path/to/conda/install/envs/testenv/bin/../lib/./libwcs.so.5 (0x00007fe03963e000)
libcfitsio.so.8 => /path/to/conda/install/envs/testenv/bin/../lib/./libcfitsio.so.8 (0x00007fe039311000)
libcurl.so.4 => /path/to/conda/install/envs/testenv/bin/../lib/./libcurl.so.4 (0x00007fe03928b000)
libz.so.1 => /path/to/conda/install/envs/testenv/bin/../lib/./libz.so.1 (0x00007fe03926f000)
libgsl.so.23 => /path/to/conda/install/envs/testenv/bin/../lib/./libgsl.so.23 (0x00007fe038fc6000)
libcblas.so.3 => /path/to/conda/install/envs/testenv/bin/../lib/./libcblas.so.3 (0x00007fe03740d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe03a049000)
librt.so.1 …Run Code Online (Sandbox Code Playgroud) 我是python和numpy的新手所以请原谅我,如果这个问题是如此简陋!我有一个负值数组(它已排序):
>>>neg
[ -1.53507843e+02 -1.53200012e+02 -1.43161987e+02 ..., -6.37326136e-1 -3.97518490e-10 -3.73480691e-10]
>>>neg.shape
(12922508,)
Run Code Online (Sandbox Code Playgroud)
我需要将此数组添加到其副本(但具有正值)以查找分布的标准偏差平均为零.所以我做了以下事情:
>>>pos=-1*neg
>>>pos=pos[::-1] #Just to make it look symmetric for the display bellow!
>>>total=np.hstack((neg,pos))
>>>total
[-153.50784302 -153.20001221 -143.1619873 ..., 143.1619873 153.20001221 153.50784302]
>>>total.shape
(25845016,)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,但奇怪的是这个新数组的总和不是零:
>>>numpy.sum(total)
11610.6
Run Code Online (Sandbox Code Playgroud)
标准偏差也完全没有达到我的期望值,但我猜这个问题的根源与此相同:为什么总和不会导致零?
当我将这个方法应用于一个小数组时; 例如[-5,-3,-2],总和变为零.所以我猜问题在于数组的长度(超过2000万个元素).有什么办法可以解决这个问题吗?
如果有人能帮助我,我将非常感激.
我有三列非结构化数据,并希望对它们进行双变量样条拟合.我对Python中的类不太好,所以我不明白如何做到这一点.为了表明我的问题,我做了一个简单的代码:
#! /usr/bin/env python3
import numpy as np
from scipy import interpolate
#an array of 3 columns:
a=np.zeros((200, 3))
a[:,0]=np.random.uniform(0,1,200)
a[:,1]=np.random.uniform(3,5,200)
a[:,2]=np.random.uniform(10,12,200)
#find the boundries
min_x, max_x = np.amin(a[:,0]), np.amax(a[:,0])
min_y, max_y = np.amin(a[:,1]), np.amax(a[:,1])
#Set the resolution:
x_res=1000
y_res=int( ( (max_y-min_y) / (max_x-min_x) )*x_res )
#Make a grid
grid_x, grid_y = np.mgrid[min_x:max_x:x_res*1j, min_y:max_y:y_res*1j]
sbsp=interpolate.SmoothBivariateSpline(a[:,0], a[:,1], a[:,2])
b=sbsp.ev(4,5)
#c=sbsp.ev(grid_x, grid_y)
print(b)
Run Code Online (Sandbox Code Playgroud)
这给出了一个点的插值,但如果你注释掉第二个最后一行,它就不起作用.如果有人能指导我如何在网格上进行样条插值,我将非常感激.提前致谢.
在 Unison(双向文件同步程序)手册中,当您设置-times=true首选项时,只有文件的时间戳保持不变,目录不变:
从手册:
times 当此标志设置为 true 时,将传播文件修改时间(但不是目录修改时间)。
我想看看是否有任何方法可以在同步过程中保留目录时间?
我在理解C如何为2D(或更多维)数组分配空间时遇到了问题,特别是在我们使用malloc等时.以这个问题中的程序为例.
首先定义一维指针数组,然后将指向1D数据数组(在这种情况下为字符串)的指针放在第一个1D数组的每个框中.因此无法保证整个2D数组是连续的(前一行的最后一个单元后跟下一行的第一个单元).每个1D数据阵列可以非常远,只有它们的指针是连续的.我纠正还是错过了什么?如果你能帮助我澄清这一点,我将非常感激.
我需要在C中使用不同类型的几个数组上做同样的事情.
使用void *我编写了一个将接收所有类型的函数:
void
floatarraymanip(void *inarray)
{
float *array=(float *)inarray;
[SEVERAL LINES OF OPERATIONS]-------------
} |
|
void |
longarraymanip(void *inarray) ----> Same
{ |
long *array=(long *)inarray; |
|
[SEVERAL LINES OF OPERATIONS]-------------
}
void
arraymanip(void *array, char *arraytype)
{
if(strcmp(arraytype,"FLOAT")==0)
floatarraymanip(array);
if(strcmp(arraytype,"LONG")==0)
floatarraymanip(array);
}
Run Code Online (Sandbox Code Playgroud)
的[SEVERAL LINES OF OPERATIONS]是完全一样的和相对长(约50线).我还需要为其他几种类型执行此操作,使我的源代码的当前版本非常长!
所以我的问题是:有什么方法可以在预处理器中将所有这些行保存在一个命令中,并在所有这些函数中调用该预处理器变量,以便程序变得更短更可读?