我只是学习MATLAB,我发现很难理解循环与矢量化函数的性能因素.
在我之前的问题中:嵌套for循环在MATLAB中非常慢(预分配)我意识到使用矢量化函数与4个嵌套循环在运行时间上产生了7倍的差异.
在该示例中,不是循环遍历4维阵列的所有维度并计算每个向量的中值,而是仅调用中值(stack,n)更清洁和更快,其中n表示中值函数的工作维度.
但中位数只是一个非常简单的例子,我很幸运,它实现了这个维度参数.
我的问题是你如何自己编写一个函数,它与实现这个维度范围的函数一样有效?
例如,您有一个my_median_1D仅适用于1-D向量并返回数字的函数.
你如何my_median_nD通过采用n维数组和"工作维度"参数来编写一个像MATLAB的中位数一样的函数?
更新
我找到了更高维度计算中位数的代码
% In all other cases, use linear indexing to determine exact location
% of medians. Use linear indices to extract medians, then reshape at
% end to appropriate size.
cumSize = cumprod(s);
total = cumSize(end); % Equivalent to NUMEL(x)
numMedians = total / nCompare;
numConseq = cumSize(dim - 1); % …Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
#include <iostream>
#include <string>
#include <chrono>
#include <memory>
#include <cstdlib>
#include <cstdint>
#include <cstring>
#include <immintrin.h>
using namespace std;
const int p[9] = {1, 10, 100,
1000, 10000, 100000,
1000000, 10000000, 100000000};
class MyTimer {
private:
std::chrono::time_point<std::chrono::steady_clock> starter;
public:
void startCounter() {
starter = std::chrono::steady_clock::now();
}
int64_t getCounterNs() {
return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now() - starter).count();
}
};
int convert1(const char *a) {
int res = 0;
for (int i=0; i<9; i++) res = res * 10 + a[i] - 48; …Run Code Online (Sandbox Code Playgroud) 我想评估一个包含算术表达式的字符串向量 - "1 + 2","5*6"等.
我知道我可以将单个字符串解析为表达式,然后将其评估为eval(parse(text="1+2")).
但是,我更愿意在不使用for循环的情况下评估向量.
foo <- c("1+2","3+4","5*6","7/8") # I want to evaluate this and return c(3,7,30,0.875)
eval(parse(text=foo[1])) # correctly returns 3, so how do I vectorize the evaluation?
eval(sapply(foo, function(x) parse(text=x))) # wrong! evaluates only last element
Run Code Online (Sandbox Code Playgroud) 假设我有一系列这样的整数值排列在一个numpy数组中。
nan = np.nan
arr = np.array([3, nan, nan, nan, 5, nan, nan, nan, nan, nan])
Run Code Online (Sandbox Code Playgroud)
nan 值应填充从第一个非空值到零的倒数。
[3, 2, 1, 0, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud) 给定寄存器中的数字(二进制整数),如何将其转换为十六进制ASCII数字字符串?
数字可以存储在存储器中或即时打印,但存储在存储器中并一次打印通常更有效.(您可以修改存储的循环,而不是一次打印一个循环.)
我们能否有效地处理与SIMD并行的所有半字节?(SSE2或更高版本?)
我一直在研究标准算法,并注意到您可以指定执行策略。
此处的文档列出了 4 项政策:
std::execution::sequenced_policy
std::execution::parallel_policy
std::execution::parallel_unsequenced_policy
std::execution::unsequenced_policy
Run Code Online (Sandbox Code Playgroud)
我了解并行策略和有序策略之间的区别,但我不确定为什么您还需要未排序和未排序的并行?
据我所知,无论如何您都无法保证线程执行顺序,所以这不会使并行和并行未排序策略相同吗?
如果您不能并行化策略自动回退到顺序策略,为什么要添加正常的未排序策略?
我错过了什么?