我正在编写性能密集型Fortran代码,其核心是无矩阵矩阵乘法子程序mfmult(x,y),它接受输入向量x,并返回输出向量y,如果i = i_ {n -1} i_ {n-2} ... i_2i_1i_0是一个n位二进制数(可能带有前导零),然后
y(i)= sum {x(j):j是i的任何1位否定}
即
y(000) = x(001)+x(010)+x(100)
y(1101) = x(0101)+x(1001)+x(1111) + x(1100) etc.
Run Code Online (Sandbox Code Playgroud)
实现这一目标的有效方法是什么?一个相关的问题是:Fortran中是否存在快速内在的单位否定?我已经看过内在函数和https://rosettacode.org/wiki/Bitwise_operations#Fortran,但是没有单位否定操作,我担心任何手动编码/分支语句都会使事情变得太慢.
我有一个Expression存储代数术语的类。我希望它拥有的公共接口是这样的:
expr.add({1}) // add term "x1". (error: code adds constant 1)
expr.add({0,1}) // add term "x0 * x1".
expr.add({0},2) // add term "2 * x0"
expr.add(2) // add constant 2
Run Code Online (Sandbox Code Playgroud)
但是我遇到的问题expr.add({1})是被解释为添加整数 1,而不是添加包含 1 的向量。有什么办法可以修复下面的实现以允许上面的接口?(或者至少抓住它?)因为打字expr.add(std::vector({1}))太冗长了。
#include <tuple>
#include <vector>
#include <unordered_set>
#include <iostream>
class Expression
{
using var_t = unsigned int;
using term_t = std::pair<int, std::vector<var_t>>;
std::vector<term_t> terms;
public:
void add(const std::vector<var_t>& vars, int coeff=1)
{
std::cout << "Adding a term" << std::endl;
terms.push_back(std::make_pair(coeff, vars)); …Run Code Online (Sandbox Code Playgroud) I have a very simple function
template<typename T>
bool is_element(const std::vector<T> & vec, T el)
{
return (std::find(vec.begin(), vec.end(), el) != vec.end());
}
Run Code Online (Sandbox Code Playgroud)
that is supposed to just check if an element exists in a vector. But I run into problems when for example el is an unsigned long and vec is an integer vector. The template types are different initially, but the same after implicit conversion. Is there any elegant way to deal incorporate implicit conversion into templates without …
在 c++ 中遍历映射(或 unordered_map)时,键和值通过 .first 和 .second 访问。但是有没有办法以更语义上有意义的方式访问键/值对?
例如,如果我将代数表达式存储在 map< set, int> 中:
x - 2yz + 3xyz --> expr = { {{'x'}, 1}, {{'y','z'}, -2}, {{'x','y','z'}, 3} }
Run Code Online (Sandbox Code Playgroud)
我想遍历地图,想要这样做似乎很自然:
for(auto & term : expr)
term.vars ...
term.coeff ...
Run Code Online (Sandbox Code Playgroud)
代替
for(auto & term : expr)
term.first ...
term.second ...
Run Code Online (Sandbox Code Playgroud)
有没有办法用 a 来实现这一点struct Term { set<char> vars; int coeff; };?我看不出有任何方法可以将这样的结构与 map 集成,但我也想不出任何根本原因为什么它应该是不可能的,因为例如它在 python 中是微不足道的:[(vars,coeff) for vars,coeff in expr.items()].
这可能是一个简单的问题,但我无法将"当前对象"传递给一个将其作为参数的自由函数.
这是一个简单的例子,说明了我的问题.
我有一个Cat类,以及一个基于Cat对象创建模因的外部函数"createCatMeme".但是如果我想让一个Cat对象对自己的模因做出"反应",并且反应是一种Cat方法,我该如何将当前的Cat传递给"createCatMeme"?
class Cat
{
std::string name;
Cat() {...}
inline react(Meme meme) {...}
inline reactToOwnMeme()
{
Meme meme = createCatMeme(/* How do I pass in the 'current' Cat object? */);
react(meme);
}
};
Meme createCatMeme(const Cat& c);
Run Code Online (Sandbox Code Playgroud)