如何完全删除 vcpkg 以及它所做的所有安装/系统更改?
我记得看到一些关于 vcpkg 的常见问题解答,其中说您可以删除 vcpkg 文件夹。但是,一个多小时以来,我一直试图找到相同的常见问题解答,但无济于事。此外,“仅删除文件夹”作为解决方案对我来说似乎难以置信,因为我假设 vcpkg 更改了一些环境变量或其他设置,以及与我尝试使用的 Visual Studio 的集成。关于这个主题的在线搜索只会让人们讨论如何一次删除多个已安装的库,甚至没有明确的解决方案(我也会对此感兴趣)。vcpkg 网站本身似乎没有提供这个问题的答案。
编辑:我在docs.microsoft发现页面上写着“只需删除文件夹” 。
我想使用 numpy 数组作为输入数据训练卷积神经网络(使用 Tensorflow 1.13 版中的 tf.keras)。训练数据(我目前存储在一个 > 30GB 的“.npz”文件中)不能一次全部放入 RAM。将大型数据集保存和加载到神经网络中进行训练的最佳方法是什么?由于我没有设法找到这个(肯定无处不在?)问题的好答案,我希望在这里听到一个。非常感谢您提供任何帮助!
类似的问题似乎已经被问过很多次了(例如training-classifier-from-tfrecords-in-tensorflow、tensorflow-synchronize-readings-from-tfrecord、how-to-load-data-parallelly-in-tensorflow)但有几个岁,通常不包含决定性的答案。
我目前的理解是使用 TFRecord 文件是解决这个问题的好方法。到目前为止,我发现的最有前途的教程解释了如何在 keras 中使用 TFRecord 文件是medium.com。其他有用的来源是machinelearninguru.com和medium.com_source2和来源therin。
官方 tensorflow 文档和教程(关于tf.data.Dataset、导入数据、tf_records等)对我没有帮助。特别是,即使没有修改,那里给出的几个例子对我也不起作用。
我假设 TFRecords 是解决我的问题的好方法,但我很难使用它们。这是我根据教程medium.com制作的示例。我尽可能地精简了代码。
# python 3.6, tensorflow 1.13.
# Adapted from https://medium.com/@moritzkrger/speeding-up-keras-with-tfrecord-datasets-5464f9836c36
import tensorflow as tf
import numpy as np
from tensorflow.python import keras as keras
# Helper functions (see also https://www.tensorflow.org/tutorials/load_data/tf_records) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用find_package
CMake 中包含库。
这个问题讨论如何告诉CMake链接到GMP库(外部)。我正在尝试按照那里的答案的步骤进行操作,但没有任何<name>Config.cmake
或<name>-config.cmake
文件,正如一些评论中提到的,这似乎是默认的。当您不知道如何获取/查找这些文件时,答案没有提及任何解决方案。该答案的评论链接到旧网站(外部)其中有很多损坏的链接,该网站描述了加载模块列表。我不清楚这些模块从哪里来以及如何获取它们。
根据官方 CMake文档(外部),如果找不到配置文件,find_package
则从“模块模式”回退到“配置模式”。我不明白这意味着什么以及在什么情况下这会相关,特别是因为文档不鼓励阅读有关“配置模式”的内容。
文档说
首先在 CMAKE_MODULE_PATH 中搜索该文件,然后在 CMake 安装提供的“查找模块”中搜索。
我仍然对这些配置文件是否应该与 CMake 一起提供还是与相关库一起提供以及它们应该位于何处感到困惑。也许两者都有可能,但在特定情况下如何知道呢?
示例代码,尝试遵循现代最佳实践:
# CMakeLists.txt (not working)
cmake_minimum_required(VERSION 3.2) # I have no idea what version I actually need
project (GMP_demo_project)
# Enable C++17 standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(GMP REQUIRED)
# Create the executable from sources
add_executable(GMP_demo GMP_demo.cpp)
target_link_libraries(GMP_demo gmp gmpxx)
Run Code Online (Sandbox Code Playgroud)
该代码输出一条错误消息,大致如下
CMake Error at CMakeLists.txt:10 (find_package):
By not providing "FindGMP.cmake" in …
Run Code Online (Sandbox Code Playgroud) (问题是指 Julia 版本 v1.5)
我试图了解@deprecate
宏在 Julia 中的工作原理。该文档是不幸的是没有明确对我说:
@deprecate old new [ex=true]
弃用旧方法并指定替换调用新方法。通过将 ex 设置为 false 来防止 @deprecate 导出旧的。@deprecate 定义了一个与旧方法具有相同签名的新方法。
警告:从 Julia 1.5 开始,@deprecate 定义的函数在没有设置 --depwarn=yes 标志的情况下运行 julia 时不会打印警告,因为 --depwarn 选项的默认值为 no。警告是从 Pkg.test() 运行的测试中打印出来的。
例子
julia> @deprecate old(x) new(x)
旧(具有 1 个方法的通用函数)
julia> @deprecate old(x) new(x)
假旧(具有 1 个方法的通用函数)
那我该怎么办?
function old(x::Int)
print("Old behavior")
end
function new(x::Int)
print("New behavior")
end
# Adding true/false argument doesn't change my observations.
@deprecate old(x) new(x) # false
old(3)
# Prints "Old …
Run Code Online (Sandbox Code Playgroud) 注意:这个问题指的是Julia v1.5。当然,任何时候答案都应该理想地回答最新版本的问题。
Julia 安装提供了一个默认环境(称为,例如@v1.5
)。当在某个工作目录中运行 Julia 时,可以julia>] activate .
创建一个新环境或激活当前环境(如果当前文件夹包含诸如 之类的文件Project.toml
)。
当 Julia 代码在某个环境中运行时,该环境定义了可以通过using
或导入哪些包(或模块) import
。但是,始终可以使用默认环境中安装的软件包。我还没有在文档中看到这个事实(尽管可能提到过),并在花了一些时间追踪丢失的导入后“艰难地”了解到了这一点。
这有优点也有缺点:有时人们觉得需要使用不属于项目真正一部分的包,例如用于分析或调试。如果这些安装在默认环境中,则可以使用它们而不会污染项目依赖项。另一方面,add
尽管项目使用了某个包,但可能会忘记将某个包添加到项目的环境中。Project.toml
在这种情况下,其他用户无法从和重现必要的环境Manifest.toml
。(向 Julia 启动时运行的 Julia 脚本添加重要代码也可能有这个缺点)。
在我看来,有几种方法可以解决这个问题:
我的问题:是否有更多(更好?)的方法来处理这个问题?哪种选择对 Julia 来说是惯用的?
注意:这个问题指的是Julia v1.6。当然,任何时候答案都应该理想地回答最新版本的问题。
朱莉娅的宏观卫生似乎存在很多问题和困惑。当我阅读相关手册页时,我仍然很难在使用插值 ( $name
)quote
和其他引用语法、宏和作用于表达式的函数之间的行为差异等内容时编写宏esc
。
Julia 提供了哪些工具来查找宏中的错误以及如何有效地使用它们?
这当然是一个广泛的问题,我认为它非常值得一个专门的手册页,而不是当前元编程概述中的事后想法。尽管如此,我认为通过考虑和调试一个具体的例子可以有效地回答这个问题(即,以一种教会我和其他人很多关于主要、一般性问题的方式)。因此,我将讨论一个简单的
(请注意,宏Base.@locals
“构造[s]一个包含调用站点定义的所有局部变量的名称(作为符号)和值的字典”[来自文档字符串]。)
# Julia 1.5
module MyModule
foo = "MyModule's foo"
macro mac(print_local=true)
println("Dump of argument:{")
dump(print_local)
println("}\n\n")
local_inmacro = "local in the macro"
return quote
println(repeat("-", 30)) # better readability of output
# intention: use variable local to the macro to make a temporary variable in the user's scope
# (can you think of a reason why one might want to do this?)
var_inquote …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Python 中重现以下 MATLAB 代码的行为:
% Matlab code
wavelength = 10
orientation = 45
image = imread('filename.tif') % grayscale image
[mag,phase] = imgaborfilt(image, wavelength, orientation)
gabor_im = mag .* sin(phase)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我没有许可证,无法运行代码。此外,imgaborfilt的官方 Matlab 文档没有准确指定函数的作用。
由于缺乏明显的替代方案,我尝试在 Python 中使用 OpenCV(对其他建议开放)。我没有使用 OpenCV 的经验。我正在尝试使用cv2.getGaborKernel
和cv2.filter2D
。我也找不到这些函数行为的详细文档。Afaik 没有关于 OpenCV 的 Python 包装器的官方文档。函数的文档字符串提供了一些信息,但它不完整且不精确。
我发现了这个问题,其中在 C++ 中使用 OpenCV 来解决问题。我假设这些函数的工作方式非常相似(另请注意 官方 C++ 文档)。但是,它们有许多附加参数。我怎样才能找出 matlab 函数真正做了什么来重现行为?
# python 3.6
import numpy as np
import cv2
wavelength = 10
orientation …
Run Code Online (Sandbox Code Playgroud) 这是一个初学者问题,但我在文档(或 StackOverflow)中找到答案时遇到了一些困难,我认为这对其他人也有帮助。问题很简单:
Julia 宏调用如何知道宏的参数何时完成?
当使用括号来标记参数时,它应该很简单(我认为......)。然而,在另一种情况下,它似乎更加微妙。我怀疑它与“表达式的数量”有关(这本身可能是一个有点棘手的概念),但我不确定,我想要有记录的官方规则。
我认为这并不明显的一些例子:
julia> macro a(arg...)
print(arg)
end;
julia> @a gg=3 if true # the :(gg = 3) is the first argument of the macro
print("val")
a = 1;;; # the macro does not see the semicolons (which makes sense to me)
end # the if statement is the second argument of the macro
# note: replacing "true" by "@a true" makes the number of arguments of
# the second macro depend on the following newline being …
Run Code Online (Sandbox Code Playgroud) 我很惊讶 StackOverflow 上有这么多主题涉及找出系统的字节顺序和转换字节顺序。更令我惊讶的是,这两个问题有数百种不同的答案。到目前为止,我看到的所有建议的解决方案都是基于未定义的行为、非标准编译器扩展或特定于操作系统的头文件。在我看来,如果现有答案提供了符合标准、高效(例如,使用 x86- )、支持编译时间的解决方案,则这个问题只是重复的。bswap
当然,一定有一个符合标准的解决方案可用,但我无法在一大堆旧的“hacky”解决方案中找到它。还有一点奇怪的是,标准库中没有包含这样的函数。也许对此类问题的态度正在改变,因为 C++20 在标准中引入了一种检测字节顺序的方法(通过std::endian
),并且 C++23 可能会包含std::byteswap
,这会翻转字节顺序。
无论如何,我的问题是:
从什么 C++ 标准开始,是否有一种可移植的符合标准的方法来执行主机到网络字节顺序转换?
我在下面论证这在 C++20 中是可能的。我的代码正确吗?可以改进吗?
这样的纯 C++ 解决方案是否应该优先于操作系统特定功能(例如 POSIX-)htonl
?(我想是的)
我想我可以给出一个独立于操作系统、高效(无系统调用,使用 x86- )并且可移植到小端和大端系统(但不能移植到混合端系统)的C++23 解决方案:bswap
// requires C++23. see https://gcc.godbolt.org/z/6or1sEvKn
#include <type_traits>
#include <utility>
#include <bit>
constexpr inline auto host_to_net(std::integral auto i) {
static_assert(std::endian::native == std::endian::big || std::endian::native == std::endian::little);
if constexpr (std::endian::native == std::endian::big) {
return i;
} else {
return std::byteswap(i);
}
}
Run Code Online (Sandbox Code Playgroud)
由于std::endian
在 C++20 中可用,因此可以通过手动实现 …
我想了解可执行文件的工作原理。我希望详细了解一个非常具体的示例将使我能够做到这一点。我的最终目标(可能过于雄心勃勃)是获取一个 hello-world .exe 文件(使用 C 编译器编译并链接)并详细了解它是如何加载到内存中并由 x86 处理器执行的。如果我成功了,我想写一篇文章和/或制作关于它的视频,因为我还没有在互联网上找到这样的东西。
我想问的具体问题用粗体标出。当然,非常欢迎任何进一步的建议和来源做类似的事情。非常感谢您的帮助!
此答案概述了 C 代码在作为程序进入物理内存之前所经历的过程。我还不确定我有多想研究 C 代码是如何编译的。有没有办法在汇编之前查看 C 编译器生成的汇编代码?我可能会认为了解加载和链接过程是值得的。与此同时,我需要了解的最重要的部分是
我对 PA 格式有一个非常基本的了解(这种理解将在“到目前为止我学到的东西”一节中概述)并且我认为那里提供的资料应该足够了,我只需要再研究一下,直到我足够了解基本的 Hello-World 程序。当然,非常欢迎有关此主题的更多来源。
对于 x86 来说,将字节码转换为汇编代码(反汇编)似乎相当困难。尽管如此,我很想了解更多关于它的信息。您将如何反汇编一个短字节代码段?
我仍在寻找一种查看进程内存(分配给它的虚拟内存)内容的方法。我已经研究过 windows-kernel32.dll 函数,例如ReadProcessMemory
但还不能让它工作。我也很奇怪似乎没有(免费)工具可用于此目的。再加上对加载的理解,我也许就能理解进程是如何从 RAM 运行的。此外,我正在寻找允许查看整个进程虚拟内存内容的汇编程序员的调试工具。我目前搜索的起点是这个问题。您对我如何查看和理解从 RAM 加载和进程执行有进一步的建议吗?
这个 StackOverflow 问题的其余部分详细描述了我到目前为止所学到的知识并提供了各种来源。它旨在可复制并帮助任何试图理解这一点的人。但是,我对目前看到的示例仍然有一些疑问。
在 Windows 中,可执行文件遵循PA 格式。在官方文件和这篇文章给出的格式的一个很好的概述。该格式描述了 .exe 文件中各个字节的含义。开头是我不会担心的 DOS 程序(出于遗留原因包括在内)。然后是一堆标头,它们提供有关可执行文件的信息。实际的文件内容被分成具有名称的部分,例如“.rdata”。在文件头之后,还有段头,它告诉您文件的哪些部分是哪个段以及每个段的作用(例如,如果它包含可执行代码)。
可以使用诸如 dumpbin(用于查看二进制文件的微软工具)之类的工具来解析标题和部分。为了与 dumpbin 输出进行比较,可以使用十六进制编辑器甚至使用 Powershell(命令Format-Hex -Path <Path …
我正在使用 CMake(在 CLion IDE 中,但这对于本次讨论来说并不重要)。到目前为止,我一直在使用诸如set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
或 之类的东西set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
来设置 GCC 的编译器选项。我假设 CMake 将这些直接传递给编译器。然而,CMake 应该是独立于平台的,并且(至少原则上)能够使用不同的编译器构建相同的代码。这是否意味着人们应该采取不同的做法?
我一直在考虑使用构建配置。例如,我假设使用构建类型标志调用 CMake:
cmake .. -DCMAKE_BUILD_TYPE="Release"
启用一些优化。然而,我无法找到任何有关此标志到底有何作用的文档(可能是因为它取决于所使用的编译器等内容)。我有两个问题:
读取 CMake 生成的 makefile 来查找标志对我来说似乎不是一个选择。我尝试设置VERBOSE=yes
Make 但不知何故它没有给我编译器标志,只是一些“进入结束退出目录”。
我有一个班级,其中有几个(可能很大)std::vector<T>
成员。据我所知,这不算是坏风格。简化示例:
// C++17
#include<vector>
struct ThreeVectors {
std::vector<int> v1;
std::vector<int> v2;
std::vector<int> v3;
};
Run Code Online (Sandbox Code Playgroud)
然后我还有一个函数,它计算一些std::vector<int>
参数并将它们包装成一个ThreeVectors
对象:
ThreeVectors no_move(const std::vector<int> &vv1, // copy manually in the function
std::vector<int> vv2, // copy when passing argument
const std::vector<int> &vv3 // copy when wrapping into ThreeVectors
) {
auto modvv = vv1; // make a copy
// perform lots of manipulations, including changing size (e.g. filtering).
modvv.at(0)++;
vv2.at(0)++; // perform lots of manipulations
// do nothing with vv3.
return …
Run Code Online (Sandbox Code Playgroud) julia ×4
c++ ×3
cmake ×2
macros ×2
python ×2
assembly ×1
c ×1
clion ×1
debugging ×1
deprecated ×1
disassembly ×1
endianness ×1
executable ×1
gabor-filter ×1
gmp ×1
hygiene ×1
matlab ×1
move ×1
opencv ×1
scikit-image ×1
tensorflow ×1
tf.keras ×1
tfrecord ×1
vcpkg ×1
windows ×1