有两个向量。您需要遍历它们的所有元素并执行相同的操作,首先对一个向量的元素进行操作,然后对第二个向量的元素进行操作。
std::vector<int> mas1 = {0,1,2,3};
std::vector<int> mas2 = {4,5,6,7,8,9};
for (auto num : mas1) { do_smth (); }
for (auto num : mas2) { do_smth (); }
是否可以在一个循环中执行相同的操作,但不创建共享向量?
有两个向量。您需要遍历它们的所有元素并执行相同的操作,首先对一个向量的元素进行操作,然后对第二个向量的元素进行操作。
std::vector<int> mas1 = {0,1,2,3};
std::vector<int> mas2 = {4,5,6,7,8,9};
for (auto num : mas1) { do_smth (); }
for (auto num : mas2) { do_smth (); }
是否可以在一个循环中执行相同的操作,但不创建共享向量?
有一个数组std::vector<unsigned int> mas
,你需要找到非零元素中的最小值。
通过这种方式可以轻松找到最小值:
auto min_pos = std::min_element (mas.begin (), mas.end (), [&](unsigned int a, unsigned int b){ return a < b; });
unsigned int m = *min_pos;
我专门用 lambda 编写,因为(在我看来)我需要向其中添加一些棘手的东西,到底是什么 - 我无法弄清楚。
修改数组是不可能的;如果可以的话,我会std::remove
根据拇指进一步做。
我在看似简单的代码中使用了 lambda:
#include <iostream>
#include <functional>
using my_type = unsigned int;
int main()
{
my_type def_val = -1;
auto correct_value = [&] (my_type &x, const my_type y, std::function<const my_type& (const my_type&, const my_type&)> selector)
{
if (x != def_val)
x = selector (x, y);
else
x = y;
};
my_type x = 10;
correct_value (x, 20, std::min<my_type>);
std::cout << x << std::endl;
return 0;
}
但它给出了一个编译错误:
main.cpp:18:5: error: no matching function for call to object of type '(lambda at main.cpp:10:22)'
correct_value (x, 20, std::min<my_type>);
^~~~~~~~~~~~~
main.cpp:10:22: note: candidate function not viable: no overload of 'min' matching 'std::function<const my_type &(const my_type &, const my_type &)>' (aka 'function<const unsigned int &(const unsigned int &, const unsigned int &)>') for 3rd argument
auto correct_value = [&] (my_type &x, const my_type y, std::function<const my_type& (const my_type&, const my_type&)> selector)
我做错了什么?似乎第三个参数(函数)对应于原型。但他还是骂。
在线编译器中的代码:tyk
我训练了一个 keras 模型,然后使用 mmdnn 将其转换为pytorch。然后我尝试在 c++ 代码中使用它:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <torch.h>
int main()
{
cv::Mat image;
image= cv::imread("test_img.png", cv::IMREAD_GRAYSCALE); // Read the file
try
{
torch::jit::script::Module module;
module = torch::jit::load("my_model.pth");
torch::IntArrayRef input_dim = std::vector<int64_t>({ 1, 2, 256, 256});
cv::Mat input_img;
image.convertTo(input_img, CV_32FC3, 1 / 255.0);
torch::Tensor x = torch::from_blob(input_img.data, { 1, 2, 256, 256 }, torch::kFloat);
torch::NoGradGuard no_grad;
auto output = module.forward({ x });
float* data = static_cast<float*>(output.toTensor().data_ptr());
cv::Mat output_img = cv::Mat(256, 256, CV_32FC3, data);
cv::imwrite("output_img.png", output_img);
}
catch (std::exception &ex)
{
std::cout << "exception! " << ex.what() << std::endl;
}
return 0;
}
作为启动的结果,收到了一个异常:
例外!isTensor() INTERNAL ASSERT FAILED at E:\20B\pytorch\pytorch\aten\src\ATen/core/ivalue_inl.h:112,请向 PyTorch 报告错误。预期张量但得到元组(toTensor at E:\20B\pytorch\pytorch\aten\src\ATen/core/ivalue_inl.h:112)(没有可用的回溯)
float* data = static_cast<float*>(output.toTensor().data_ptr());
调用toTensor()
. _ 如果改为使用toTuple()
,则生成的对象没有data_ptr()
我需要获取包含神经网络响应的数据的方法(然后将其放入opencv图片中以稍后保存)。
如何仍然从神经网络的响应中提取图片?
在下面的代码中, const 类方法B
调用了其成员的非 const 方法A &a_ref
,这似乎与const
限定符的逻辑相矛盾(理论上,代码不应该编译)。为什么会发生这种情况?
最低代码:
#include <iostream>
class A
{
public:
void NonConstHello() /*const*/
{
std::cout << "non const Hello from A!" << std::endl;
}
};
class B
{
public:
A &a_ref;
explicit B(A &a) : a_ref(a) {}
void ConstHello() const /*const method*/
{
a_ref.NonConstHello(); // calls non-const method for his member???
std::cout << " const Hello from B!" << std::endl;
}
};
int main()
{
A a;
B b(a);
b.ConstHello();
return 0;
}
结论:
non const Hello from A!
const Hello from B!
使用关键字时如何确定初始化变量的类型auto
?
在什么情况下,变量会变成常量、引用、指针或所有这些的各种组合?
const auto
额外的指示,例如, auto&
(const auto&
以及可能类似的带有指针的指示,甚至可能带有双指针和带有)将如何影响这些规则&&
?
以下代码是否包含 UB ?对本地对象的引用在返回时会变坏,但如果它们是通过const
引用返回的,那么它们的生命周期会延长,所有返回都是通过const
引用进行的(尽管通过auto
),一切似乎都很好:
std::vector<int> Foo(int N = 10)
{
std::vector<int> rv;
for (int i = 0; i < N; ++i)
{
rv.push_back(i + 10);
}
return rv;
}
int GetNumber()
{
const auto &num = Foo().front();
return num;
}
int main()
{
int x = GetNumber();
std::cout << x << std::endl;
return 0;
}
PS。然而,这段代码有时表现得不恰当(不完全是这个,我把所有东西都压缩成一个最小的例子,我们有更复杂对象的 std::vector,并且仍然有线程并行旋转,这一切都增加了真实表现的可能性UB)。
有几个带有 h5 扩展名的文件,他们把它们扔给我,说它们包含有关某些神经网络的信息,从文件的名称来看,那里肯定有权重系数。尚无有关文件的更多信息(但我们正在尝试联系文件的作者,他们只是来自另一个国家,尚未回复)。
如果,当然,这是某种格式,我在哪里可以阅读神经网络的 h5 格式的描述?以及如何/如何读取这样的文件?最好将其转换为 TensorFlow 格式或其他已知的格式...
我什至不确定这个文件是否完全定义了神经网络,因为,例如,在 OpenVINO 格式中,包含 2 个文件,一个带有神经网络架构描述的 xml 和一个带有权重的单独二进制文件。在这里,也许,只有重量。
我在 MSVC2017 环境中使用 OpenCV。
该程序有一个调用:
keyPressed = cv::waitKey(1)
编译时链接错误:
Error LNK2001 unresolved external symbol "int __cdecl cv::waitKey(int)"
应该将什么库(.lib 文件)添加到waitKey
链接?
一般来说,在哪里看,哪些 OpenCV 功能需要哪些库?对于某些人来说,这很容易用谷歌搜索(我自己找到了一些),但例如,未找到 waitKey。或者在使用 OpenCV 时连接一组库可能是正确的?那么,让所有功能正常工作的列表是什么?
OpenVINO 在加载网络时出错。
编码:
// 1 - Читаем сеть
InferenceEngine::Core core;
InferenceEngine::CNNNetReader network_reader;
network_reader.ReadNetwork(modelXmlName);
network_reader.ReadWeights(modelBinName);
// 2 - Получаем сеть из класса-читалки
auto network = network_reader.getNetwork();
// 3 - Получаем информацию о входах и выходах сети
InferenceEngine::InputsDataMap input_info(network.getInputsInfo());
InferenceEngine::OutputsDataMap output_info(network.getOutputsInfo());
// 4 - Конфигурируем входы и выходы сети
for (auto &item : input_info)
{
auto input_data = item.second;
input_data->setPrecision(InferenceEngine::Precision::U8);
input_data->setLayout(InferenceEngine::Layout::NCHW);
input_data->getPreProcess().setResizeAlgorithm(InferenceEngine::RESIZE_BILINEAR);
input_data->getPreProcess().setColorFormat(InferenceEngine::ColorFormat::RGB);
}
// 5 - Загружаем сеть
auto executable_network = core.LoadNetwork(network, "CPU");
称呼
auto executable_network = core.LoadNetwork(network, "CPU");
抛出具有以下内容的异常:
Unsupported primitive of type: DetectionOutput name: DetectionOutput_
做错了什么?在这个调用之前似乎有必要配置其他东西,但我不明白具体是什么。
让我们看一下代码:
#include <stdio.h>
int main()
{
unsigned char xi;
unsigned char xf;
int bi = -300;
float bf = -300;
xi = bi;
xf = bf;
printf("xi = %d\n", xi);
printf("xf = %d\n", xf);
return 0;
}
我们得到输出:
xi = 212
xf = 0
尽管预计它会unsigned char
正确溢出并且两个变量都等于212
. 有趣的是,当标志存在时-O0
(没有优化),输出如预期:
xi = 212
xf = 212
带有标志-O1
及以上,已经出现差异。
显然,我在这里踩到了某种未定义的行为,告诉我这里到底发生了什么?关节在哪里?
PS。当溢出“向上”时,如果float
跳过,输出为 255,如示例中所示。
在以下示例中:
#include <iostream>
#include <typeinfo>
int main()
{
unsigned char a, b, c;
a = 100;
b = 100;
c = 100;
int x = (a + b + c);
std::cout << "typeid(a + b + c) = " << typeid(a + b + c).name() << std::endl;
std::cout << "x = " << x << std::endl;
std::cout << "a + b + c = " << a + b + c << std::endl;
return 0;
}
我们得到输出:
typeid(a + b + c) = i
x = 300
a + b + c = 300
如您所见,无符号字符的总和没有溢出,并且总和的类型结果是 int。这对我来说很奇怪,在我看来,标准保证无符号类型溢出,除以最大可表示数的余数,也就是说,在上面的例子中,x 应该等于 300% 256 = 44 .
我的错误是什么?最好参考标准或 cppreference。
PS。实验链接:http ://cpp.sh/7t35b
任务非常简单。
给定一个图像,一个数组,让它是整数,大小为 m x n。我们想通过一个 k x l 的窗口来遍历它,并在每个窗口中计算最小值(然后将这个最小值写在某个地方,但这不适用于算法)。
额头中的算法将给出复杂度 O (mnkl)。
您可以应用具有最小堆(堆)的算法,然后渐近线将下降到 O (log (kl) n (mk + l)) (也许我错了,但我是这样做的)。
带有堆的算法看起来像这样:向右或向左走一步,我们将新到达的数字添加到堆中(k 或 l 个添加,每个 log (kl)),并删除相同的数量(列或行,时间与添加时间相同)。
为了支持删除,堆需要巧妙地实现,通过一个代理对象,除了数字本身,它还包含它在堆中的位置的索引,堆将更新这些索引,并通过它们执行删除请求(实际上,这是一个标准技巧,如果我们通过堆实现滚动 k 统计量,我不知道不使用代理的算法)。
对于一维数组的情况,移动最小值也可以使用队列以线性时间计算。对于二维情况,我无法概括此解决方案。
我认为的方向是多么真实。也许我错过了一些明显的算法,而我正坐着,从头开始发明复杂性。堆算法有多合适?会不会因为代理的开销,我们会花费这么多时间,以至于天真的实现会更快?
好吧,也许有一种比一堆算法更快的方法?类推一维情况。
是否可以将流传输std::cout
到每次输出后自动完成的模式std::cout << std::flush
?
解决方案选项:
std::flush
在每次输出后显式写入std::cout
,重载其移位运算符,然后刷新。但是肯定有一些常规的方法可以做到这一点,我无法谷歌它,我找不到一个查询,以便谷歌能够理解我想要什么。有谁知道如何做到这一点?
一个逻辑门可以这样描述:
pred_or(1, 1).
pred_or(1, 0).
pred_or(0, 1).
其余谓词类似。但也许有一种更正确的方法来指示,根据真值表,在哪些组合上,门(0 和 1)的输出将等同于哪个值。上述方法正确吗?还是做一些不同的事情更好?
我的代码:
parent(pamela, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, patricia).
parent(patricia, jim).
ancestor(X, Y) :- parent(X, Y); ancestor(X, Z), parent(Z, Y).
% Кому Памела является предком?
query1(X) :- ancestor(pamela, X), write(X), nl, fail.
要求:
query1(X).
给出错误消息:
ERROR: Out of local stack
bob
ann
patricia
jim
在在线翻译器中推出(链接)。
我做错了什么?
我的代码:
parent(pamela, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, patricia).
parent(patricia, jim).
grandparent(X, Y) :- parent(X, Z), parent(Z, Y).
% Кто прародители Патриции?
query(X) :- grandparent(X, patricia).
在在线翻译器(链接)中,我提出了一个要求:
query(X).
作为回应,我得到:
X = pamela
迷路的汤姆。如何让它显示所有的祖父母?
告诉我,我试图在在线序言翻译器(https://rextester.com/l/prolog_online_compiler )中写一个事实,如教程中所述:
parent(Maria, Daria).
收到警告:
Warning: source_file.prolog:5:
Singleton variables: [Maria,Daria]
为什么会出现此警告?是否有必要提前声明变量?