小编Kyl*_*S-C的帖子

numpy.linalg.inv如何计算正交矩阵的逆?

我正在实现一个LinearTransformation类,它继承numpy.matrix并用于numpy.matrix.I计算变换矩阵的逆.

有没有人知道在尝试计算逆矩阵之前numpy是否检查矩阵的正交性?我问,因为我的大多数矩阵(但不是全部)都是正交的,我想知道在尝试反转之前是否要执行一些快速正交性检查.

python numpy linear-algebra scipy

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

在 Fortran 中分配字符数组

我必须编写一个可以由 C 和 Fortran 调用的子例程。该子例程将文件名作为其参数之一。我知道为了与 C 良好地互操作,ISO C 绑定建议使用字符数组进行互操作。

我的问题是:是否存在易于编写的字符数组文字之类的东西?我有一个这样的子程序:

subroutine my_sub(char_array)
  use iso_c_binding, only: c_char
  char(kind=c_char, len=1), dimension(:), intent(in) :: char_array
  ...
end subroutine my_sub
Run Code Online (Sandbox Code Playgroud)

是否可以通过以下方式调用它:

call my_sub('Hello World!')
Run Code Online (Sandbox Code Playgroud)

或者我必须做一些可怕的事情,比如:

call my_sub((/ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' /))
Run Code Online (Sandbox Code Playgroud)

我的主要问题似乎是它不喜欢假定形状的数组,并且给它一个设定的(大)大小也会输出随后拾取的所有垃圾内存。

有更好的方法吗?

string fortran character-arrays fortran-iso-c-binding

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

使用自定义键比较对象列表

我根据它们的一个属性对一些对象进行排序,使用类似这样的东西:

sorted_list = sorted(unsorted_list, key=lambda x: x.my_attr)
Run Code Online (Sandbox Code Playgroud)

有没有办法对这些对象的列表列表进行排序,就像Python可以对整数列表列表进行排序一样?我可以__cmp__(self, other)为这些对象重载,但这会在外部包中引发困难.嵌套也可能变得任意深,所以我认为我不能只使用列表理解.

我想知道是否有什么东西我可以生成my_attrs的列表并将其链接到相应的对象列表.我想不出一个好的方法来做到这一点.

python sorting list

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

版本控制GitHub CODEOWNERS文件

我们使用" 成功的Git分支模型 " 在GitHub上托管了一个git repo .

为了保护master和dev分支,我们有一对CODEOWNERS文件.要掌握的PR需要用户A的批准,而PR需要用户A,B或C的批准.

我不知道如何处理CODEOWNERS文件的版本控制.理想情况下,我们希望它们保持静态,但是,由于CODEOWNERS文件不同,在dev或master之间启动PR导致合并冲突.

我是否可以设置分支历史记录,以便master/dev不会尝试同步CODEOWNERS文件?我需要做些什么?

我是repo管理员,因此可以暂时禁用master/dev上的PR要求.

github

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

在Fortran和C之间传递字符串

我在Fortran和C之间传递字符串时遇到问题。

Fortran子例程调用如下所示:

CALL MMEINITWRAPPER(TRIM(ADJUSTL(PRMTOP)), 0, SALTCON, RGBMAX, CUT)
Run Code Online (Sandbox Code Playgroud)

与之配合使用的C具有签名:

int mmeinitwrapper_(char *name,
                    int *igb,
                    REAL_T *saltcon,
                    REAL_T *rgbmax1,
                    REAL_T *cutoff1)
Run Code Online (Sandbox Code Playgroud)

我在不同的地方放了一些打印语句,然后一切正常,直到使用ifort编译为止。在这种情况下,输出如下所示:

  Topology file name:
 coords.prmtop                                                                  
   coords.prmtop
 Topology file name length:          81          13
length in C: 8 
read argument: coords.prmtop??* 
Reading parm file (coords.prmtop??*)
coords.prmtop??*, coords.prmtop??*.Z: does not exist
Cannot read parm file coords.prmtop??*
Run Code Online (Sandbox Code Playgroud)

使用波特兰编译器:

  Topology file name:
 coords.prmtop                                                                    
 coords.prmtop
 Topology file name length:           81           13
length in C: 8 
read argument: coords.prmtop 
Reading parm file (coords.prmtop)
Run Code Online (Sandbox Code Playgroud)

第一组中的长度来自未修剪/未调节弦的Fortran,然后来自修剪/已调节弦。C中的长度为sizeof(name)/sizeof(name[0])

似乎正在传递一段过长的内存,并且在随后的运行中,您会写入不同长度的不良内容(尽管C中报告的长度始终为8)。 …

c fortran

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

如何查看共享库加载的顺序

给定一个 ELF 二进制文件或共享对象,我如何才能最轻松地查看所需共享库的加载顺序?

它们是否按照列出的顺序加载readelf -d

linker shared-libraries elf

3
推荐指数
2
解决办法
6599
查看次数

将分配的C_PTR传递给Fortran数组到C

我在访问C中的数组时遇到了segfaults的问题,这个数组是在下面的Fortran文件中分配的.有一些调试的假象,例如文件写入没有写任何有意义的事实,我初始化一个i我从不使用的变量.

但是,我发现了以下内容:

  • 没有初始化i(但仍然声明):没有段错误
  • 不在C中打开文件:没有段错误
  • 不在代码中的其他地方打印HESS(不HESS_COPY):没有段错误
  • i使用不同的名称声明和初始化:segfault

有谁知道什么可能会引起这种行为?段错误本身就出现在该行ARRAY_PTR = C_LOC(HESS_COPY(1, 1)).我正在编译使用gfortrangcc调试标志(没有优化).

valgrind 说有一个无效的写(前两个文件是我在下面显示的文件):

 Invalid write of size 8
    at 0xBEEA3E: get_pointer (modsparsehess.f90:34)
    by 0xA75D7A: print_hess (sparse_hessian_c.c:108)
    by 0x866C95: quench_ (quench.f:316)
    by 0x7F2DBE: mc_ (mc.F:368)
    by 0x4B65E2: mcruns_ (mcruns.f:62)
    by 0x459245: MAIN__ (main.F:430)
    by 0x45A33F: main (main.F:21)
  Address 0x87 is not stack'd, malloc'd or (recently) free'd
Run Code Online (Sandbox Code Playgroud)

C档

#include <stdio.h>

void get_pointer(double ** hessian);

void print_hess(int *arr_size) { …
Run Code Online (Sandbox Code Playgroud)

c fortran fortran-iso-c-binding

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

在枚举中使用 Copy 的超特征时,类型不会实现 Copy 错误

我对 Rust 特征很陌生,所以这可能是由于对超级特征或dyn其他任何东西的误解。我试图在枚举中使用特征对象来:

  • 对可在枚举的该元素中使用的具体类型进行特征绑定
  • 确保枚举仍然可以派生Copy

最小的示例(无法在Rust 游乐场上编译并出现相关错误)是:

#[derive(Copy)]
enum Foo {
    A,
    B(dyn MyTraitWhichIsCopy),
}

trait MyTraitWhichIsCopy: Copy {}
Run Code Online (Sandbox Code Playgroud)

错误是:

error[E0204]: the trait `Copy` may not be implemented for this type
 --> src/lib.rs:1:10
  |
1 | #[derive(Copy)]
  |          ^^^^
...
4 |     B(dyn MyTraitWhichIsCopy),
  |       ---------------------- this field does not implement `Copy`
  |
  = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due …
Run Code Online (Sandbox Code Playgroud)

rust trait-objects

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

使用列表推导或map()从现有列表创建更大的列表

我正在尝试生成一个列表来索引坐标(x,y和z),给定一组原子索引.我的问题很简单,如何优雅地从这个列表:

atom_indices = [0, 4, 5, 8]
Run Code Online (Sandbox Code Playgroud)

到此列表:

coord_indices = [0, 1, 2, 12, 13, 14, 15, 16, 17, 24, 25, 26]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我最简单的阅读/理解方式是:

coord_indices = []
for atom in atom_indices:
    coord_indices += [3 * atom,
                      3 * atom + 1,
                      3 * atom + 2]
Run Code Online (Sandbox Code Playgroud)

但这似乎不是Pythonic.如果没有列表列表或元组列表,有没有更好的方法?

python list-comprehension list

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