我有一个描述地面集的矩阵NxM(通常是10k X 10k元素).每行代表一个对象,每列代表一个特定的特征.例如,在矩阵中
f1 f2 f3
x1 0 4 -1
x2 1 0 5
x3 4 0 0
x4 0 1 0
Run Code Online (Sandbox Code Playgroud)
对象x1在特征1中具有值0,在特征1中具有值4,在特征-1中具有值0.这个值是一般实数(double's).
我必须计算所有对象(所有对线)之间的几个自定义距离/不相似度.为了比较,我想计算L1(曼哈顿)和L2(欧几里德)距离.
我使用Eigen库来执行我的大部分计算.为了计算L2(欧几里得),我使用以下观察:对于两个大小为n的向量a和b,我们有:
||a - b||^2 = (a_1 - b_1)^2 + (a_2 - b_2)^2 + ... +(a_n - b_n)^2
= a_1^2 + b_1^2 - 2 a_1 b_1 + a_2^2 + b_2^2 - 2 a_2 b_2 + ... + a_n^2 + b_n^2 - 2 a_n b_n
= a . a + b . … 我使用了C++ 11标准提供的新的基于范围的for循环,我提出了以下问题:假设我们vector<>使用基于范围的迭代迭代for,并且我们在向量的末尾添加一些元素这个迭代.那么,什么时候循环结束?
例如,请参阅以下代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<unsigned> test({1,2,3});
for(auto &num : test) {
cout << num << " ";
if(num % 2)
test.push_back(num + 10);
}
cout << "\n";
for(auto &num : test)
cout << num << " ";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用"-std = c ++ 11"标志测试了G ++ 4.8和Apple LLVM版本4.2(clang ++),输出是(对于两者):
1 2 3
1 2 3 11 13
Run Code Online (Sandbox Code Playgroud)
请注意,第一个循环终止于原始向量的末尾,尽管我们向其添加了其他元素.似乎for-range循环仅在开始时评估容器结束.事实上,这是范围的正确行为吗?是否由委员会指定?我们能相信这种行为吗?
请注意,如果我们改变第一个循环
for(vector<unsigned>::iterator it = test.begin(); it != test.end(); ++it) …Run Code Online (Sandbox Code Playgroud) 我正在使用 C++11,我发现了一种在映射(无序和/或多映射)中插入值的非常有用的方法:
map<unsigned, string> test;
test.insert({1, "abc"});
Run Code Online (Sandbox Code Playgroud)
虽然这段代码可以工作(用 GCC 4.8 或 Clang 3.2 编译),但我有一些问题。基本上有insert()6 个我们感兴趣的签名
1. pair<iterator,bool> insert (const value_type& val);
2. template <class P> pair<iterator,bool> insert (P&& val);
3. void insert (initializer_list<value_type> il);
Run Code Online (Sandbox Code Playgroud)
前两个接受一个pair<const key_type,mapped_type>类型对象,而最后一个接受一个 then 列表。所以,理论上,代码
test.insert({1, "abc"});
Run Code Online (Sandbox Code Playgroud)
正在使用第二个insert()版本/签名,其中它使用 C++11 统一初始化来构建该对,因此将该对用作lvalue. 这可以“解释”为
test.insert(pair<const unsigned, string> {1, "abc"});
Run Code Online (Sandbox Code Playgroud)
请注意,我们还可以这样做
test.insert(pair<const unsigned, string>(1, "abc"));
Run Code Online (Sandbox Code Playgroud)
或者
test.insert(make_pair(1, "abc"));
Run Code Online (Sandbox Code Playgroud)
但第一个版本似乎更自然。这种方法有什么重大问题吗?与列表初始值设定项版本可能存在冲突?
使用 matplotlib,我们可以“简单地”使用fill_between()示例中的方法填充两条垂直线之间的区域:
使用 matplotlib,我可以制作我需要的东西:
我们有两个信号,我正在计算滚动/移动 Pearson 和 Spearman 的相关性。当相关性低于 -0.5 或高于 0.5 时,我想对周期进行着色(Pearson 为蓝色,Spearman 为橙色)。我还在所有地块中用灰色将周末变暗。
但是,我发现使用 Plotly 很难完成相同的任务。了解如何在两条水平线之间进行操作也很有帮助。
请注意,我使用 Plotly 和 Dash 来加速多个绘图的可视化。用户要求更“动态类型的东西”。然而,我不是一个 GUI 人,不能花时间在这上面,尽管我需要用初步结果来喂养他们。
顺便说一句,我过去尝试过 Bokeh,但由于某种我不记得的原因而放弃了。Plotly 看起来不错,因为我可以使用 Python 或 R,这是我的主要开发工具。
谢谢,
卡洛斯
这可能是使用dplyr和tidyverse 工具的一个非常基本的问题,但我找不到一个好的方法来做到这一点。
\n假设我有一个宽格式的数据框,并且我想选择行,以便列的子集具有所有相同的值。天真地,我可以执行以下操作:
\n> df <- tribble(\n ~name, ~id, ~cost, ~value1 , ~value2, ~value3,\n "a", 1, 10, 1, 1, 1,\n "a", 2, 20, 1, 2, 1,\n "b", 3, 50, 1, 1, 3,\n "b", 4, 45, 1, 1, 1,\n "b", 5, 70, 2, 2, 2\n)\n\n\n> df %>% select(\n value1 == value2 &\n value1 == value3 &\n value2 == value\n)\n\n# A tibble: 3 \xc3\x97 6\n name id cost value1 value2 value3\n <chr> <dbl> <dbl> <dbl> <dbl> …Run Code Online (Sandbox Code Playgroud)