有像矩阵一样
ma = [[0.343, 0.351, 0.306], [0.145, 0.368, 0.487]]
Run Code Online (Sandbox Code Playgroud)
我想得到一个像这样的矢量:
[0.343, 0.145, 0.351, 0.368, 0.306, 0.487]
Run Code Online (Sandbox Code Playgroud)
试图得到它,我正在使用numpy,reshape但它不起作用.
a = np.array(ma)
>>> print a.shape
(2, 3)
Run Code Online (Sandbox Code Playgroud)
但我得到:
c = a.reshape(3, 2, order='F')
>>> print c
array([[ 0.343, 0.368],
[ 0.145, 0.306],
[ 0.351, 0.487]])
Run Code Online (Sandbox Code Playgroud)
对于任何矩阵大小,最好的方法是什么?我的意思是,例如,如果矩阵不是平方的:
[[0.404, 0.571, 0.025],
[0.076, 0.694, 0.230],
[0.606, 0.333, 0.061],
[0.595, 0.267, 0.138]]
Run Code Online (Sandbox Code Playgroud)
我想得到:
[0.404, 0.076, 0.606, 0.595, 0.571, 0.694, 0.333, 0.267, 0.025, 0.230, 0.061, 0.138]
Run Code Online (Sandbox Code Playgroud) 如果我有一个包含3行和5列的数组,如下所示:
int arr[3][5]={0};
Run Code Online (Sandbox Code Playgroud)
现在我想输入一些数字,所以我喜欢这样:
int arr[3][5] ={10,8,9}
Run Code Online (Sandbox Code Playgroud)
现在数组设置如下:
10 8 9 0 0
0 0 0 0 0
0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
但我想要的是,实际上数组中的第一个列元素设置如下:
10 0 0 0 0
8 0 0 0 0
9 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
我如何交换或更改数组顺序是这样的?
我是 numpy 的新手,我正在阅读 numpy,但我无法理解 numpy 中的行专业和列专业,有人可以用最简单的方法举例解释吗?任何答案将不胜感激
我正在为我的项目编写 3D 数学库,我想知道 Rust 是列专业还是行专业?例如,我有一个二维数组作为矩阵,我想将它提供给 C 库(如 OpenGL 或 Vulkan),对于这些库,拥有一个紧密排列的列主数组很重要。
multidimensional-array rust row-major-order column-major-order
按照此链接上的问题,对于二维数组“ x(i,j) ”,是否考虑一般规则(我的意思是对于大多数语言),行索引的第一个索引i和索引j对于列的索引?
我知道 Fortran 是列专业,C 语言是行专业,对于两者来说,经典约定似乎是 i = 行和 j = 列,不是吗?
另外,谁能告诉我Matlab是行专业还是列专业?
我正在读一本书,其中有这一段:
C 中的数组可以看作是一块连续的内存。更准确地说,数组的最后一维是连续部分。我们称之为行优先顺序。了解这一点以及在访问未缓存的数据时缓存错误将完整的缓存行加载到缓存中以防止后续缓存错误的事实,我们可以理解为什么使用 array[0][0] 访问维度为 10000x10000 的数组可能会加载 array[ 0][1] 在缓存中,但随后访问 array[1][0] 会产生第二个缓存错误,因为它与 array[0][0] 相距 sizeof(type)*10000 字节,因此肯定不是在同一缓存线上。这就是为什么这样迭代效率低下的原因:
#define ARRLEN 10000
int array[ARRLEN][ARRLEN];
size_t i, j;
for (i = 0; i < ARRLEN; ++i)
{
for(j = 0; j < ARRLEN; ++j)
{
array[j][i] = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
您能否向我解释一下他们在本段中试图解释的内容以及他们所谈论的“缓存故障”是什么?
我不确定问这个问题的最佳地点在哪里,但我目前正在使用 ARM 内在函数并遵循本指南:https : //developer.arm.com/documentation/102467/0100/Matrix-multiplication-example
但是,那里编写的代码假设数组是按列优先顺序存储的。我一直认为 C 数组是按行优先存储的。他们为什么要这样假设?
编辑:例如,如果不是这样:
void matrix_multiply_c(float32_t *A, float32_t *B, float32_t *C, uint32_t n, uint32_t m, uint32_t k) {
for (int i_idx=0; i_idx < n; i_idx++) {
for (int j_idx=0; j_idx < m; j_idx++) {
for (int k_idx=0; k_idx < k; k_idx++) {
C[n*j_idx + i_idx] += A[n*k_idx + i_idx]*B[k*j_idx + k_idx];
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
他们这样做了:
void matrix_multiply_c(float32_t *A, float32_t *B, float32_t *C, uint32_t n, uint32_t m, uint32_t k) {
for (int i_idx=0; i_idx …Run Code Online (Sandbox Code Playgroud)