QR 分解求解 CUDA 中的线性系统

2023-11-26

我正在GPU上写一个图像恢复算法,详细信息在

Cuda:最小二乘求解,速度较差

求解线性系统的QR分解法

Ax=b  

工作原理如下

min||Ax-b|| ---> ||QRx-b||  ---> ||(Q^T)QRx-(Q^T)b|| ---> ||Rx-(Q^T)b||

where R是上三角矩阵。由此产生的上三角线性系统很容易求解。

我想使用CULA工具来实现这个方法。 CULA例程GEQRF计算 QR 分解。手册说:

退出时,数组对角线上和上方的元素包含 这min(M,N)-by-N上梯形矩阵R (R是上 三角形如果m >= n);对角线下方的元素,其中 大批TAU, 表示正交/酉矩阵Q作为产品 的min(m,n)基本反射器。

我不知道在哪里Q已存储,并且该算法对我来说似乎太复杂了。你能给什么建议吗?

Thanks!


截至 2015 年 2 月,CUDA 7.0(现在处于候选版本中)提供了新的 cuSOLVER 库,包括计算矩阵 QR 分解的可能性。与 cuBLAS 库结合使用,可以根据 cuSOLVER 用户指南附录 C 中阐述的指南求解线性系统。

您必须遵循的步骤是三个:

1) geqrf:它通过返回上三角矩阵来计算矩阵的QR分解R在上三角部分A和矩阵Q以 Householder 向量的形式存储在下三角部分A,而 Householder 向量的缩放因子由TAU范围;

2) ormqr:它返回的乘积Q和一个矩阵C通过覆盖C;

3) trsm:它求解上三角线性系统。

下面,我提供了这些例程的使用的完整示例。

#include "cuda_runtime.h"
#include "device_launch_paraMeters.h"

#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>

#include <cusolverDn.h>
#include <cublas_v2.h>
#include <cuda_runtime_api.h>

#include "Utilities.cuh"
#include "TimingGPU.cuh"

#define BLOCK_SIZE 32

#define prec_save 10

/***************/
/* COPY KERNEL */
/***************/
__global__ void copy_kernel(const double * __restrict d_in, double * __restrict d_out, const int M, const int N) {

    const int i = blockIdx.x * blockDim.x + threadIdx.x;
    const int j = blockIdx.y * blockDim.y + threadIdx.y;

    if ((i < N) && (j < N)) d_out[j * N + i] = d_in[j * M + i];
}

/****************************************************/
/* LOAD INDIVIDUAL REAL MATRIX FROM txt FILE TO CPU */
/****************************************************/
// --- Load individual real matrix from txt file
template <class T>
void loadCPUrealtxt(T * __restrict h_out, const char *filename, const int M) {

    std::ifstream infile;
    infile.open(filename);
    for (int i = 0; i < M; i++) {
        double temp;
        infile >> temp;
        h_out[i] = (T)temp;
    }

    infile.close();

}

/************************************/
/* SAVE REAL ARRAY FROM GPU TO FILE */
/************************************/
template <class T>
void saveGPUrealtxt(const T * d_in, const char *filename, const int M) {

    T *h_in = (T *)malloc(M * sizeof(T));

    gpuErrchk(cudaMemcpy(h_in, d_in, M * sizeof(T), cudaMemcpyDeviceToHost));

    std::ofstream outfile;
    outfile.open(filename);
    for (int i = 0; i < M; i++) outfile << std::setprecision(prec_save) << h_in[i] << "\n";
    outfile.close();

}

/********/
/* MAIN */
/********/
int main(){

    // --- Extension of Appendix C.1 of cuSOLVER library User's Guide
    // --- See also http://www.netlib.org/lapack/lug/node40.html

    // --- ASSUMPTION Nrows >= Ncols
    const int Nrows = 500;
    const int Ncols = 500;

    TimingGPU timerGPU;
    double timingQR, timingSolve;

    // --- cuSOLVE input/output parameters/arrays
    int work_size = 0;
    int *devInfo;           gpuErrchk(cudaMalloc(&devInfo, sizeof(int)));

    // --- CUDA solver initialization
    cusolverDnHandle_t solver_handle;
    cusolveSafeCall(cusolverDnCreate(&solver_handle));

    // --- CUBLAS initialization
    cublasHandle_t cublas_handle;
    cublasSafeCall(cublasCreate(&cublas_handle));

    /***********************/
    /* SETTING THE PROBLEM */
    /***********************/
    // --- Setting the host, Nrows x Ncols matrix
    double *h_A = (double *)malloc(Nrows * Ncols * sizeof(double));
    loadCPUrealtxt(h_A, "D:\\Project\\solveNonSquareLinearSystemQRCUDA\\solveNonSquareLinearSystemQRCUDA\\testMatrix.txt", Nrows * Ncols);

    // --- Setting the device matrix and moving the host matrix to the device
    double *d_A;            gpuErrchk(cudaMalloc(&d_A, Nrows * Ncols * sizeof(double)));
    gpuErrchk(cudaMemcpy(d_A, h_A, Nrows * Ncols * sizeof(double), cudaMemcpyHostToDevice));

    // --- Initializing the data matrix C (Of course, this step could be done by a kernel function directly on the device).
    // --- Notice that, in this case, only the first column of C contains actual data, the others being empty (zeroed). However, cuBLAS trsm
    //     has the capability of solving triangular linear systems with multiple right hand sides.
    double *h_C = (double *)calloc(Nrows * Nrows, sizeof(double));
    loadCPUrealtxt(h_C, "D:\\Project\\solveNonSquareLinearSystemQRCUDA\\solveNonSquareLinearSystemQRCUDA\\testVector.txt", Nrows);

    double *d_C;            gpuErrchk(cudaMalloc(&d_C, Nrows * Nrows * sizeof(double)));
    gpuErrchk(cudaMemcpy(d_C, h_C, Nrows * Nrows * sizeof(double), cudaMemcpyHostToDevice));

    /**********************************/
    /* COMPUTING THE QR DECOMPOSITION */
    /**********************************/
    timerGPU.StartCounter();

    // --- CUDA QR GEQRF preliminary operations
    double *d_TAU;      gpuErrchk(cudaMalloc((void**)&d_TAU, min(Nrows, Ncols) * sizeof(double)));
    cusolveSafeCall(cusolverDnDgeqrf_bufferSize(solver_handle, Nrows, Ncols, d_A, Nrows, &work_size));
    double *work;   gpuErrchk(cudaMalloc(&work, work_size * sizeof(double)));

    // --- CUDA GEQRF execution: The matrix R is overwritten in upper triangular part of A, including diagonal 
    //     elements. The matrix Q is not formed explicitly, instead, a sequence of householder vectors are
    //     stored in lower triangular part of A.
    cusolveSafeCall(cusolverDnDgeqrf(solver_handle, Nrows, Ncols, d_A, Nrows, d_TAU, work, work_size, devInfo));
    int devInfo_h = 0;  gpuErrchk(cudaMemcpy(&devInfo_h, devInfo, sizeof(int), cudaMemcpyDeviceToHost));
    if (devInfo_h != 0) std::cout << "Unsuccessful gerf execution\n\n";

    timingQR = timerGPU.GetCounter();
    printf("Timing for QR calculation = %f [ms]\n", timingQR);

    /*****************************/
    /* SOLVING THE LINEAR SYSTEM */
    /*****************************/
    timerGPU.StartCounter();

    // --- CUDA ORMQR execution: Computes the multiplication Q^T * C and stores it in d_C
    cusolveSafeCall(cusolverDnDormqr(solver_handle, CUBLAS_SIDE_LEFT, CUBLAS_OP_T, Nrows, Ncols, min(Nrows, Ncols), d_A, Nrows, d_TAU, d_C, Nrows, work, work_size, devInfo));

    // --- Reducing the linear system size
    double *d_R; gpuErrchk(cudaMalloc(&d_R, Ncols * Ncols * sizeof(double)));
    double *d_B; gpuErrchk(cudaMalloc(&d_B, Ncols * sizeof(double)));
    dim3 Grid(iDivUp(Ncols, BLOCK_SIZE), iDivUp(Ncols, BLOCK_SIZE));
    dim3 Block(BLOCK_SIZE, BLOCK_SIZE);
    copy_kernel << <Grid, Block >> >(d_A, d_R, Nrows, Ncols);
    gpuErrchk(cudaMemcpy(d_B, d_C, Ncols * sizeof(double), cudaMemcpyDeviceToDevice));

    // --- Solving an upper triangular linear system - compute x = R \ Q^T * B
    const double alpha = 1.;
    cublasSafeCall(cublasDtrsm(cublas_handle, CUBLAS_SIDE_LEFT, CUBLAS_FILL_MODE_UPPER, CUBLAS_OP_N,
        CUBLAS_DIAG_NON_UNIT, Ncols, 1, &alpha, d_R, Ncols, d_B, Ncols));

    timingSolve = timerGPU.GetCounter();
    printf("Timing for solution of the linear system = %f [ms]\n", timingSolve);
    printf("Overall timing = %f [ms]\n", timingQR + timingSolve);

    /************************/
    /* CHECKING THE RESULTS */
    /************************/
    // --- The upper triangular part of A contains the elements of R. Showing this.
    saveGPUrealtxt(d_A, "D:\\Project\\solveNonSquareLinearSystemQRCUDA\\solveNonSquareLinearSystemQRCUDA\\d_R.txt", Nrows * Ncols);

    // --- The first Nrows elements of d_C contain the result of Q^T * C
    saveGPUrealtxt(d_C, "D:\\Project\\solveNonSquareLinearSystemQRCUDA\\solveNonSquareLinearSystemQRCUDA\\d_QTC.txt", Nrows);

    // --- Initializing the output Q matrix (Of course, this step could be done by a kernel function directly on the device)
    double *h_Q = (double *)malloc(Nrows * Nrows * sizeof(double));
    for (int j = 0; j < Nrows; j++)
        for (int i = 0; i < Nrows; i++)
            if (j == i) h_Q[j + i*Nrows] = 1.;
            else        h_Q[j + i*Nrows] = 0.;

    double *d_Q;            gpuErrchk(cudaMalloc(&d_Q, Nrows * Nrows * sizeof(double)));
    gpuErrchk(cudaMemcpy(d_Q, h_Q, Nrows * Nrows * sizeof(double), cudaMemcpyHostToDevice));

    // --- Calculation of the Q matrix
    cusolveSafeCall(cusolverDnDormqr(solver_handle, CUBLAS_SIDE_LEFT, CUBLAS_OP_N, Nrows, Ncols, min(Nrows, Ncols), d_A, Nrows, d_TAU, d_Q, Nrows, work, work_size, devInfo));

    // --- d_Q contains the elements of Q. Showing this.
    saveGPUrealtxt(d_Q, "D:\\Project\\solveNonSquareLinearSystemQRCUDA\\solveNonSquareLinearSystemQRCUDA\\d_Q.txt", Nrows * Nrows);

    // --- At this point, d_C contains the elements of Q^T * C, where C is the data vector. Showing this.
    // --- According to the above, only the first column of d_C makes sense.
    //gpuErrchk(cudaMemcpy(h_C, d_C, Nrows * Nrows * sizeof(double), cudaMemcpyDeviceToHost));
    //printf("\n\n");
    //for (int j = 0; j < Nrows; j++)
    //  for (int i = 0; i < Nrows; i++)
    //      printf("C[%i, %i] = %f\n", j, i, h_C[j + i*Nrows]);

    // --- Check final result
    saveGPUrealtxt(d_B, "D:\\Project\\solveNonSquareLinearSystemQRCUDA\\solveNonSquareLinearSystemQRCUDA\\d_B.txt", Ncols);

    cusolveSafeCall(cusolverDnDestroy(solver_handle));

    return 0;
}

The Utilities.cu and Utilities.cuh运行此类示例所需的文件在此维护github页面. The TimingGPU.cu and TimingGPU.cuh文件保存于此github页面.

可以通过以下 Matlab 代码生成数据并检查结果:

clear all
close all
clc

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% GENERATE RANDOM NON-SQUARE MATRIX WITH DESIRED CONDITION NUMBER %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --- Credit to https://math.stackexchange.com/questions/198515/can-we-generate-random-singular-matrices-with-desired-condition-number-using-mat
Nrows = 500;                % --- Number of rows
Ncols = 500;                % --- Number of columns
% condNumber = 10 * sqrt(2);  % --- Desired condition number
% A = randn(Nrows, Ncols);
% [U, S, V] = svd(A);
% S(S~=0) = linspace(condNumber, 1, min(Nrows, Ncols));
% A = U * S * V';

% --- Setting the problem solution
x = ones(Ncols, 1);

% y = A * x;
% 
% Asave = reshape(A, Nrows * Ncols, 1);
% save testMatrix.txt Asave -ascii -double
% save testVector.txt y -ascii -double

load testMatrix.txt
load testVector.txt
A = reshape(testMatrix, Nrows, Ncols);
y = testVector;

[Q, R] = qr(A);

xMatlab = R \ (Q.' * y);

fprintf('Percentage rms of solution in Matlab %f\n', 100 * sqrt(sum(sum(abs(xMatlab - x).^2)) / sum(sum(abs(x).^2))));

fprintf('Percentage rms of Q * R - A %f\n', 100 * sqrt(sum(sum(abs(Q * R - A).^2)) / sum(sum(abs(A).^2))));

load d_R.txt
d_R = reshape(d_R, Nrows, Ncols);

d_R = d_R(1 : Ncols, :);
R   = R(1 : Ncols, :);

fprintf('Percentage rms of matrix R between Matlab and CUDA %f\n', 100 * sqrt(sum(sum(abs(triu(R) - triu(d_R)).^2)) / sum(sum(abs(triu(d_R)).^2))));

load d_QTC.txt
fprintf('Percentage rms of Q^T * y - d_QTC %f\n', 100 * sqrt(sum(sum(abs(Q.' * y - d_QTC).^2)) / sum(sum(abs(d_QTC).^2))));

load d_B.txt
fprintf('Percentage rms of solution in Matlab %f\n', 100 * sqrt(sum(sum(abs(d_B - x).^2)) / sum(sum(abs(x).^2))));

请根据需要注释/取消注释行。

Timing

计时(以毫秒为单位)(在 GTX960 卡上执行的测试,参见 5.2):

Size         QR decomposition       Solving system       Overall
100x100      0.89                   1.41                 2.30
200x200      5.97                   3.23                 9.20
500x500      17.08                  21.6                 38.7
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QR 分解求解 CUDA 中的线性系统 的相关文章

  • Java 2d 游戏中的路径查找?

    本质上它是我正在开发的一款吃豆人克隆游戏 我有一个 Enemy 类 并创建了该类的 4 个实例 它们都代表游戏的 4 个幽灵 所有幽灵都会在屏幕的随机区域启动 然后它们必须朝着吃豆人角色前进 当玩家控制吃豆人并移动它时 他们应该跟随它并尽可
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进
  • goto 指令对 CUDA 代码中扭曲内发散的影响

    对于CUDA中简单的warp内线程发散 我所知道的是SM选择一个重新收敛点 PC地址 并在两个 多个路径中执行指令 同时禁用未采用该路径的线程的执行效果 例如 在下面的代码中 if threadIdx x lt 16 A do someth
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 删除近排序数组中未排序/离群元素

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和
  • 无法理解Peterson算法的正确性

    我在这里讨论彼得森算法的一个场景 flag 0 0 flag 1 0 turn P0 flag 0 1 turn 1 while flag 1 1 turn 1 busy wait
  • 面试题:三个数组,O(N*N)

    假设我们有three长度数组N其中包含任意数量的类型long 然后我们得到一个数字M 相同类型 我们的任务是选择三个数字A B and C每个数组中的一个 换句话说A should从第一个数组中选取 B从第二个开始和C从第三个 所以总和A
  • 我如何开始玩五子棋?

    我读到Gomoku http en wikipedia org wiki Gomoku它可以使用 Minimax 和 Alpha Beta 剪枝算法来实现 所以 我阅读了这些算法 现在了解了游戏将如何解决 但是当我坐下来编写代码时 我面临着
  • 查找字符串中最常见的子字符串的算法

    是否有任何算法可用于查找字符串中最常见的短语 或子字符串 例如 以下字符串将 hello world 作为其最常见的两个单词短语 hello world this is hello world hello world repeats thr
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 对浮点数求和的最佳 OpenCL 2 内核是什么?

    C 17引入了许多新算法来支持并行执行 特别是标准 减少 http en cppreference com w cpp algorithm reduce是一个并行版本std 累积 http en cppreference com w cpp
  • 寻找公共子集的算法

    I have N number of sets Si of Numbers each of a different size Let m1 m2 mn be the sizes of respective sets mi Si and M
  • 如何实现n个元素的查找和插入操作的动态二分查找

    这个想法是使用多个数组 每个长度为 2 k 根据 n 的二进制表示来存储 n 个元素 每个数组都是排序的 不同的数组没有以任何方式排序 在上述数据结构中 SEARCH是通过对每个数组进行一系列二分查找来进行的 INSERT 是通过一系列相同
  • CUDA 中的原子操作失败

    由于计算能力为2 1 atomicAdd and atomicMax操作不支持双精度 那么我根据堆栈溢出的一些答案定义这两个函数 奇怪的是atomicAdd功能运行良好 但atomicMax不起作用 这是我的代码 我的代码的测试是在每个块上
  • 更改计划的开始日期以优化资源

    我有很多工作需要在特定的时间间隔执行 然而 我们每天完成这项工作的资源有限 因此 我正在尝试优化开始时间日期 开始时间日期只能向前移动 不能向后移动 以便每天使用的资源与我们的预算更加不相似 这些函数在下面的示例中使用 Function t
  • 关于复杂性(如果使用基于比较的排序算法)

    众所周知 任何基于比较模型的排序算法都有nlogn的下界 即Omega nlogn 这可以用数学证明 但众所周知 荷兰国旗问题可以在 O n 时间内对 3 个不同的元素 重复使用 进行排序 它也是基于比较模型 但可以在 O n 时间内进行排
  • Javascript树遍历算法

    我需要帮助以深度优先的方式遍历树结构 我无法想出一个算法来正确地做到这一点 我的输入是这样的 A B C 1 2 a b c d 输出应采用以下形式 A 1 a A 1 b A 1 c A 1 d A 2 a A 2 b A 2 c A 2
  • 文件比较的逻辑

    我试图编写一个用于文件比较的程序 例如 file1 1 2 3 4 5 file2 1 2 3 4 5 如果我逐行执行 我会得到 1 1 2 2 3 4 3 5 4 5 但是 事实是这些文件之间的唯一区别是 我想要得到这样的东西 1 1 2
  • 以最少插入次数将字符串转换为回文

    这是一个来自日常编码问题 https www dailycodingproblem com 给定一个字符串 找到可以通过插入来组成的回文数 单词中任何位置的字符数尽可能少 如果有 大于一个可以制作的最小长度的回文 返回 字典顺序最早的一个

随机推荐

  • Spring:如何使用@Value注释注入内联字符串列表[重复]

    这个问题在这里已经有答案了 如何使用注入字符串值列表 Value注解 我正在使用 Spring 4 1 2 我试过了 Value value top person organizationalPerson user private List
  • 从另一个 Activity 导航回来时,Android Activity onCreate 被调用两次

    我有一个应用程序 可以在用户在 webview 活动上使用 OAuth 进行身份验证后生成音乐 看起来像这样 主要播放器活动 OAuth 活动 返回主要播放器活动 但是 当从 OAuth 活动中调用 onCreate 方法时 会调用两次 导
  • 如何通过Delphi 7上传文件到dropbox?

    我尝试将文件上传到保管箱 我使用 dropbox apihttps www dropbox com developers reference api files POST procedure TDropbox Upload2 const U
  • 读/写 QObject

    I think我可以写一个QObject像这样利用Q PROPERTYs QDataStream operator lt lt QDataStream ds const Object obj for int i 0 i
  • ASP.NET 应用程序保持运行时浏览器超时

    我遇到了一种情况 ASP NET 需要很长时间才能生成网页回复 超过 2 小时 这是由于代码隐藏运行了一段时间 非常长 缓慢的循环 浏览器 IE 和 Firefox 停止等待回复 大约一个小时后 并给出一般的无法显示网页错误 类似于您尝试导
  • 使用 boost::random 作为 std::random_shuffle 的 RNG

    我有一个程序 使用来自 boost random 的 mt19937 随机数生成器 我需要进行 random shuffle 并希望为此生成的随机数来自此共享状态 以便它们可以相对于梅森扭曲器先前生成的数字具有确定性 我尝试过这样的事情 v
  • 不先查询就更新记录?

    假设我查询数据库并加载项目列表 然后 我在详细视图表单中打开其中一个项目 而不是从数据库中重新查询该项目 而是从列表中的数据源创建该项目的实例 有没有办法可以更新数据库记录而不获取单个项目的记录 这是我现在的做法示例 dataItem it
  • jquery 在 contenteditable div 中设置光标位置

    问题的旧版本如下 经过更多研究后 我决定重新表述这个问题 和以前一样 问题是 我需要聚焦一个 contenteditable div 而不突出显示文本 在 Chrome 中直接聚焦突出显示文本 我意识到人们通过重置文本区域中的插入符位置来解
  • 如何使用 Maven 在 Vaadin 7 中仅编译必要的小部件?

    我是 Vaadin 框架的新手 我看起来非常有趣 使用 eclipse 和 Maven 来开发和构建我的应用程序 我发现很烦人 每次我进行 mvn clean install 时都会花费很长时间来构建应用程序 我发现这是因为它编译了整套小部
  • 如何以编程方式设置 rw- r-- r-- 权限?

    我正在开发一个应用程序 可以将应用程序的数据恢复到 data data packageName 恢复文件后 我将权限设置为 rw r r 我是这样设置的 public int chmod File path int mode throws
  • 快速将 XML 转换为 Excel [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 将 XML 中的 112K 行转换为 Excel 视图的最快 最省力 而不是超级性能 方法是什么 为什么这么复杂 只需使用 文件 gt 打开 打开文件 选择 xml 并加载它 看
  • 消除无样式内容的闪烁

    如何停止网页上出现无样式内容 FOUC 使用 css 样式最初隐藏某些页面元素 然后使用 javascript 在页面加载后将样式更改回可见的问题是 未启用 javascript 的人将永远无法看到这些元素 所以这是一个不会正常降级的解决方
  • php中的正则表达式:取最短匹配

    我正在尝试做一个 PHP 正则表达式 但我找不到正确的方法 想象一下我有这个字符串 你好 我的 名字是彼得 和 我想吃巧克力 我想取 和 之间的部分 但如果我使用preg match string 它只返回一个字符串 名字是彼得 和 我想吃
  • Url.Action 从 Route 属性映射了错误的链接

    这是目标控制器和操作 RoutePrefix Editor public class EditorController Controller HttpGet Route id int public ActionResult Edit int
  • 如何在SQL Server中使用批量插入写入UTF-8字符?

    我正在对 sqlserver 进行批量插入 但它没有正确地将 UTF 8 字符插入数据库 数据文件包含这些字符 但执行批量插入后数据库行包含垃圾字符 我的第一个怀疑是格式文件的最后一行 10 0 3 1 SQLCHAR 0 0 1 INST
  • 如何通过 Google Maps API 找到最近的十字路口?

    如何找到距离我最近的街道的坐标 例如 假设我有一条从南到北的街道 A 北边有 X 街道 南边有 Y 街道 Google 地图 API 是否允许查找街道 A 最近的十字路口 X 或 Y 的坐标 我找不到任何地方提到过它 PS 我知道的唯一解决
  • Eclipse - 调试器不会在断点处停止

    我正在尝试对 JUnit 进行故障排除 在源代码中 我在两个位置设置了断点 1 在初始化静态成员的行中2 其中一个测试用例的第一行 调试器在静态字段初始化行停止 但它并不止于测试用例 无论我在测试用例中的何处设置断点 调试器都不会在那里停止
  • Django 表单总是显示错误“此字段为必填字段”

    当我渲染表单时 django 总是在每个字段上显示错误消息 此字段是必需的 即使没有提交表格 可能是什么问题呢 这是我的模型表格 class MMEditidStateForm forms ModelForm class Meta mode
  • 生成器与列表理解

    我有一些东西 当作为列表理解运行时 运行良好 看起来像 myClass Function things for things in biggerThing Function是一个方法 它构建一个列表 该方法本身不返回任何内容 但会在其中对列
  • QR 分解求解 CUDA 中的线性系统

    我正在GPU上写一个图像恢复算法 详细信息在 Cuda 最小二乘求解 速度较差 求解线性系统的QR分解法 Ax b 工作原理如下 min Ax b gt QRx b gt Q T QRx Q T b gt Rx Q T b where R是