将double-all的二维数组设置为-1的最快方法

fastest way to set a 2-dim array of double all to -1?

本文关键字:方法 设置 double-all 二维数组      更新时间:2023-10-16

将双精度的二维数组(如双精度x[N][N])设置为-1的最快方法是什么?

我尝试使用内存集,但失败了。有什么好主意吗?

使用来自algorithm 的:std::fill_n

std::fill_n(*array, sizeof(array) / sizeof (**array), -1 );

示例:

double array[10][10];
std::fill_n( *array, sizeof(array) / sizeof (**array), -1.0 );
//Display Matrix
for(auto i=0;i<10;i++)
{
    for(auto j=0;j<10;j++)
        cout<<array[i][j]<< " ";    
    cout<<endl;
}

一个简单的循环:

#include <stdio.h>
int main(void)
{
    #define N 5
    double x[N][N];
    size_t i, n = sizeof(x) / sizeof(double);
    for (i = 0; i < n; i++)
        x[0][i] = -1.0;
    for (i = 0; i < n; i++)
        printf("%zu) %fn", i, x[0][i]);
}
// create constants
const int rows = 10;
const int columns = 10;
// declare a 2D array
double myArray [rows][columns];
// run a double loop to fill up the array
for (int i = 0; i < rows; i++) 
    for (int k = 0; k < columns; k++)
        myArray[rows][columns] = -1.0;
// print out the results
for (int i = 0; i < rows; i++) {
    for (int k = 0; k < columns; k++)
        cout << myArray[rows][columns];
    cout << endl;
}

您也可以直接设置

    double x[4][4] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} 

如果数组索引很小。

使用std::array及其fill方法:

#include <array>
#include <iostream>
int main()
{
  const std::size_t N=4
  std::array<double, N*N> arr; // better to keep the memory 1D and access 2D!
  arr.fill(-1.);
  for(auto element : arr)
    std::cout << element << 'n';
}

使用C++容器,可以使用填充方法

array<array<double, 1024>, 1024> matrix;
matrix.fill(-1.0);

如果出于某种原因,必须坚持使用C样式数组,则可以手动初始化第一行,然后将memcpy初始化到其他行。无论您是将其定义为静态数组还是逐行分配,这都能起作用。

const int rows = 1024;
const int cols = 1024;
double matrix[rows][cols]
for ( int i=0; i<cols; ++i)
{ 
    matrix[0][cols] = -1.0;
}
for ( int r=1; r<rows; ++r)
{
    // use the previous row as source to have it cache friendly for large matrices
    memcpy(&(void*)(matrix[row][0]), &(void*)(matrix[row-1][0]), cols*sizeof(double));
}

但我宁愿尝试从C风格的数组转移到C++容器,也不愿做那种噱头。

此处不应使用

memset,因为它基于void *。所以中的所有字节都是相同的。(float) -10xbf800000double 0xbff0000000000000),因此并非所有字节都相同。。。

我会使用手动填充:

const int m = 1024;
const int n = 1024;
double arr[m][n];
for (size_t i = 0; i < m*n; i++)
    arr[i] = -1;

矩阵就像内存中的数组,所以最好有1个循环,它稍微快一点。

或者你可以使用这个:std::fill_n(arr, m*n, -1);

不确定哪一个更快,但两者看起来相似。所以你可能需要做一个小测试来找到它,但据我所知,人们通常会使用一个或另一个。另一件事,第一件是一些编译器上的更多C,它不起作用,第二件是真正的C++,它永远不会在C上起作用。所以你应该根据我认为的编程语言来选择:)