我有一个有两条线和两个不同的x轴(不同的数据单元)的情节,我的情节如下所示.
我的问题是我想把盒子的顶部线条也画成黑色(水平),而不是像它那样"开放".如果线具有x轴刻度也是很好的,与底部水平轴线相同.
显然,grid on不起作用,因为它在右侧绘制y1轴刻度,在左侧绘制y2轴刻度,这是我不想要的.
另外,我认为在Matlab 2014中,这有效:set(ax(2),'XAxisLocation','top','XTickLabel',[]);但它在Matlab 2015a中已不复存在了.
这是一个例子:
figure(1);
x = [0, 1, 2, 3];
y_1 = [3, 2, 1.5, 1];
y_2 = [0, 0.5, 0.7, 0.9];
parula_blue = [0, 0.447, 0.741]; parula_red = [0.85, 0.325, 0.098];
[ax, h1, h2] = plotyy(x, y_1, x, y_2);
set(get(ax(1),'Ylabel'),'String','Data 1', 'Color', 'k');
set(h1,'LineWidth',2,'LineStyle','-','Color',parula_blue,'DisplayName', 'Name 1');
set(ax(1),'ycolor',parula_blue);
set(ax(1), 'YTick', [0 1 2 3 4]);
set(ax(1), 'ylim', [0 4]);
set(get(ax(2),'Ylabel'),'String','Data 2', 'Color', 'k');
set(h2,'LineWidth',2,'LineStyle','--','Color',parula_red,'DisplayName','Name 2');
set(ax(2),'ycolor',parula_red);
set(ax(2),'YDir','reverse');
set(ax(2), 'YTick', [0 0.2 …Run Code Online (Sandbox Code Playgroud) 我有以下生成器表达式工作,/GS如果编译器是 MSVC,它会设置标志,并将它设置为构建配置RelWithDebInfo和Release:
target_compile_options(mytarget PRIVATE "$<$<CONFIG:Release>:$<$<CXX_COMPILER_ID:MSVC>:/GS>>$<$<CONFIG:RelWithDebInfo>:$<$<CXX_COMPILER_ID:MSVC>:/GS>>")
现在我还想让用户配置它,我添加了一个option:
option(MYTARGET_ENABLE_GS "Enable /GS" OFF)
所以现在,如果用户启用了此选项,我(显然)想要启用该/GS标志,如果他们启用了,我想添加它,如果编译器是MSVC,它应该被添加到Release和RelWithDebInfo配置。
这是非常嵌套的,我似乎无法正确理解。这是我得到的:
target_compile_options(mytarget PRIVATE "$<$<BOOL:MYTARGET_ENABLE_GS>:$<$<CONFIG:Release>:$<$<CXX_COMPILER_ID:MSVC>:/GS>>$<$<CONFIG:RelWithDebInfo>:$<$<CXX_COMPILER_ID:MSVC>:/GS>>>")
编辑:固定,见下文。
我不得不使用 the$<$<BOOL:...>>因为它“翻译”了option(可以是开/关或真/假,0或1,生成器表达式需要。但是上面的行不起作用:它不添加(或不添加)添加)/GS。
我想知道:
1)我的错误在哪里?这该怎么做?和
2)像这样的东西会导致非常复杂的嵌套表达式,这真的很难阅读 - 想象一下 6 个月后再次阅读该行代码,即使它被记录在案。而且很容易把 a>或类似的东西放错地方。我可能可以使用 "manual"if来使这更具可读性,但想象一下有 5-10 个这样的选项 - 编写一个带有内部的if/结果就像 15-30 行/endtarget_compile_optionsifend代码,这看起来也不是很漂亮. 做到这一点的最佳方法是什么?
编辑:我快到了。变量必须包含${...}在生成器表达式中。所以它是例如:
target_compile_options(mytarget PRIVATE …
覆盖优化级别标志( 等以及 MSVC 对应项 )的推荐方法-O2是-O3什么/?
target_compile_options(mytarget PUBLIC "$<$<CONFIG:RELWITHDEBINFO>:/Od>")
这会导致编译器输出:
cl:命令行警告 D9025:用“/Od”覆盖“/O2”
我很高兴使用最新的 CMake 3.13.2。
当我使用CMake时FIND_PACKAGE( OpenCV REQUIRED ),OpenCV的所有组件都被包含在内并且所有lib都链接在一起,所有路径都显示在VS中的dirs中.但是,从OpenCV 2开始,lib的每个部分都可以自己包含和链接.因此,如果我的项目只使用OpenCV的"核心"和"imgproc"部分,我不想通过链接到所有OpenCV来膨胀我的项目(和项目文件).是否有可能只在CMake中包含部分内容?
请考虑以下代码示例.为什么下面标记的行在运行时触发断点/异常?
int main() {
Mat m1 = Mat::zeros(10, 1, CV_32FC1);
Mat m2 = Mat::zeros(10, 3, CV_32FC1);
vector<float> v1(m1); // works
Mat m2sub = m2.col(0);
Mat m2subClone = m2.col(0).clone();
vector<float> v2(m2subClone); // works
vector<float> v3(m2sub); // doesn't work
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在mat.hpp中调用的内容似乎很奇怪:
template<typename _Tp> inline Mat::operator std::vector<_Tp>() const {
std::vector<_Tp> v;
copyTo(v);
return v; // <- breaks here
}
Run Code Online (Sandbox Code Playgroud)
和copyTo似乎记忆数据.
它没有给出错误消息,但我在堆栈跟踪中看到它在return语句处断开,然后深入到'operator new'和'ntdll.dll!RtlpAllocateHeap()'.
奇怪的是,在我的完整代码中,它在一个稍微不同的地方中断:在memcpy的copyTo(v)内部,并抛出"访问冲突写入位置0x0000000001F43D4C.".我的完整代码看起来与上面的代码完全相同,但矩阵更大.
编辑:如果在上面的示例中,我将矩阵更改为
Mat m1 = Mat::zeros(5900, 1, CV_32FC1);
Mat m2 = Mat::zeros(5900, 3, CV_32FC1);
Run Code Online (Sandbox Code Playgroud)
由于访问冲突错误,代码段在与完整代码相同的位置失败.
我有超过2GB的RAM免费,并且该应用程序被编译为64位应用程序,因此它不应该是"内存不足"问题(?)
我遇到了一个奇怪的问题,它只在Release模式下显示,但没有在Debug模式下(使用VS2015 RC).Aggregate初始化的第二个类成员使用与第一个相同的值,即使它应该默认初始化.
更为奇特的,有一次我改变Base() = default;到Base() {};的古怪行为也没有了.但它们应该是等价的,不应该吗?我找到了VS bug吗?
我能够把它归结为:
#include <iostream>
#include <vector>
#include <random>
using namespace std;
class Base {
public:
Base() = default; // elicits the odd behaviour on VS Release mode
//Base() {}; // works
Base(std::vector<int> m) : m(m) {};
size_t get_m() const { return m.size(); };
private:
std::vector<int> m;
std::mt19937 engine;
};
class Aggregate {
public:
Aggregate() = default;
Aggregate(Base one, Base two) : one(one), two(two) {};
Base get_one() const { …Run Code Online (Sandbox Code Playgroud) 我有一个带浮点数的函数,我正在用它们做一些计算,我想在返回的结果中尽可能保持准确性.我读到,当你乘以两个浮点数时,你的有效数字加倍.
因此,当两个浮点数相乘时,例如float e, f;我这样做double g = e * f,这些位何时被截断?
在我下面的示例函数中,我是否需要转换,如果是,在哪里?这是一个紧密的内循环,如果我把static_cast<double>(x)每个变量a b c d放在它使用的地方,我得到5-10%的减速.但我怀疑我不需要单独转换每个变量,只在某些位置,如果有的话?或者在这里返回一个双倍并不会给我任何收益,我也可以返回一个浮点数?
double func(float a, float b, float c, float d) {
return (a - b) * c + (a - c) * b;
}
Run Code Online (Sandbox Code Playgroud) 我有一个链接到boost_program_options的应用程序,其CMakeLists.txt看起来像
FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES( ${SUBPROJECT_NAME} ${Boost_LIBRARIES} )
Run Code Online (Sandbox Code Playgroud)
我#define BOOST_ALL_NO_LIB在我的代码中使用之前包含<boost/program_options.hpp>禁用vs2010中boost的自动链接,因为我想通过cmake指定它以使其与linux兼容.
在Linux中,这段代码编译得很好(使用cmake,make和gcc).但在使用VS2010的Windows中,我得到了一个
2>App.obj : error LNK2001: unresolved external symbol "public: static unsigned int const boost::program_options::options_description::m_default_line_length" (?m_default_line_length@options_description@program_options@boost@@2IB)
2>App.obj : error LNK2001: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > boost::program_options::arg" (?arg@program_options@boost@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)
Run Code Online (Sandbox Code Playgroud)
请注意,链接器找到了lib - 如果找不到它,我会得到更多未解决的外部错误.
我将问题跟踪到以下内容:http:
//lists.boost.org/boost-users/2009/11/54015.php,它很好地描述了正在发生的事情(这两个是全局变量).现在提出的解决方案是启用动态链接并链接到DLL.但这不是我想要做的,我想链接静态boost lib(我实际上是尝试做的,在VS中的App属性中Linker-> Input it list D:\boost\boost_1_47\lib\boost_program_options-vc100-mt-gd-1_47.lib.
我也尝试过添加
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
Run Code Online (Sandbox Code Playgroud)
到我的CMakeLists.txt但它没有改变任何东西.
任何想法如何解决这个问题?
更新:当与boost_program_options-vc100-mt-sgd-1_47.lib链接时,我得到了一大堆关于已在boost-lib中定义的CRT符号的新链接器错误.按照panickal的建议更改VS Runtime选项后,这些错误也消失了,并且正在运行.
我有一个功能的类
MyClass::doStuff(std::vector<MyCustomData*> toSort) { ...
Run Code Online (Sandbox Code Playgroud)
我打电话给他
std::sort(toSort.begin(), toSort.end(), MyClass::SortByZ());
Run Code Online (Sandbox Code Playgroud)
myClass :: SortByZ()是一个自定义比较器.现在这可行,但我想实现以下目标:
我有几个类,每个类都应该有自己的比较器函数来对"MyCustomData"进行排序.所以,例如Class1 ......应该有
class Class1 {
struct SortData {
bool operator ()(MyCustomData *lhs, MyCustomData *rhs) {
return lhs->something1 > rhs->something1;
}
};
//...many more functions/vars
}
Run Code Online (Sandbox Code Playgroud)
而Class2对于相同的数据类型具有不同的比较器函子,例如
class Class2 {
struct SortData {
bool operator ()(MyCustomData *lhs, MyCustomData *rhs) {
return lhs->something2 > rhs->something2;
}
};
//...many more functions/vars
}
Run Code Online (Sandbox Code Playgroud)
现在我希望能够用其中任何一个调用函数MyClass :: doStuff(...)
doStuff(myData, Class1::SortData)
Run Code Online (Sandbox Code Playgroud)
要么
doStuff(myData, Class2::SortData)
Run Code Online (Sandbox Code Playgroud)
并且函数MyClass :: doStuff(...)应该使用相应的排序顺序.
我没有找到这样做的方法,有吗?我想要一个简单的解决方案(不必支持模板或任何东西).如果我需要,我会愿意使用提升,但是没有提升的解决方案将是首选.
我希望我能够描述我想要实现的目标?谢谢你的帮助!
我试图在智能指针中包装OpenCV(CvPOSITObject)的C-API中的对象.根据我的理解,它应该类似于以下内容:
unique_ptr<CvPOSITObject, decltype(cvReleasePOSITObject)> positObject;
positObject = unique_ptr<CvPOSITObject, decltype(cvReleasePOSITObject)>(cvCreatePOSITObject(param1, param2), cvReleasePOSITObject);
Run Code Online (Sandbox Code Playgroud)
但是我收到编译器错误,谷歌并没有真正帮助.
这两个函数的声明是:
CVAPI(CvPOSITObject*) cvCreatePOSITObject( CvPoint3D32f* points, int point_count );
CVAPI(void) cvReleasePOSITObject( CvPOSITObject** posit_object );
Run Code Online (Sandbox Code Playgroud)
我得到类似的东西
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1227): error C2207: 'std::_Unique_ptr_base<_Ty,_Dx,_Empty_deleter>::_Mydel' : a member of a class template cannot acquire a function type
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1322): warning C4180: qualifier applied to function type has no meaning; ignored
1> Myfile.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1221): warning C4180: qualifier applied to function type has no …Run Code Online (Sandbox Code Playgroud) 我需要将目标(仅标头库)/std:c++14的标志替换为. CMake 还不支持直接在 VS 中设置 C++17 标志(请参阅如何使用 CMake 在 VS2017 中启用 /std:c++17),因此我需要手动替换它。INTERFACE/std:c++17
但是,get_target_property(my_compile_flags mylib COMPILE_OPTIONS)要检索当前设置的标志列表,然后将 /std:c++14 替换为 /std:c++17 不起作用:
INTERFACE_LIBRARY 目标只能具有白名单属性。不允许使用属性“COMPILE_OPTIONS”。
但是,您可以通过target_compile_features(...)例如手动设置它们target_compile_options(mylib INTERFACE /std:c++17)。但后一个命令添加了标志,但没有删除/std:c++14.
该怎么做呢?
最新的emscripten使用什么版本的 LLVM ?我用谷歌搜索了一段时间,但找不到任何信息。背景是我有一些需要 clang-5.0 的 C++ 代码——它用 emscripten 编译的可能性有多大?或者至少需要 clang-4.0 的代码?
我有一个指向对象的指针向量,并且在某些时候,使用该向量的子元素创建第二个向量.现在,对原始向量进行排序会更改第二个向量中的元素(排序后其中的元素完全不同).
这是预期的行为吗?它与make_indirect_iterator有关吗?有没有更好的解决方案(假设我想保留一个指针向量)?
std::vector<std::shared_ptr<MyObj>> vecAll;
std::vector<std::shared_ptr<MyObj>> vecSub;
// fill vecAll with something...
for(auto obj : vecAll) {
if( obj->x >=0 ) {
vecSub.push_back(obj);
}
}
// 3 objects in 'vecSub'
std::sort(boost::make_indirect_iterator(vecAll.begin()), boost::make_indirect_iterator(vecAll.end()), std::greater<MyObj>());
// now there are 3 DIFFERENT objects in 'vecSub'
Run Code Online (Sandbox Code Playgroud) c++ ×9
cmake ×5
c++11 ×3
opencv ×3
stl ×3
boost ×2
c++17 ×1
casting ×1
comparator ×1
emscripten ×1
llvm ×1
matlab ×1
matlab-hg2 ×1
precision ×1
shared-ptr ×1
unique-ptr ×1
vector ×1
webassembly ×1