什么是使用的优势,std::make_unique在new运营商的初始化std::unique_ptr?
换句话说,为什么
std::unique_ptr<SomeObject> a = std::make_unique(SomeObject(...))
Run Code Online (Sandbox Code Playgroud)
比做好
std::unique_ptr<SomeObject> a = new SomeObject(...)
Run Code Online (Sandbox Code Playgroud)
我尝试在线查看很多,我知道new在现代C++中避免使用操作符是一个很好的经验法则,但我不确定在这个确切的场景中有什么优势.它是否可以防止可能发生的任何类型的内存泄漏?做一个std::make_unique比使用更快new吗?
我正在尝试使用以下代码读取matlab文件
import scipy.io
mat = scipy.io.loadmat('test.mat')
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误
raise NotImplementedError('Please use HDF reader for matlab v7.3 files')
NotImplementedError: Please use HDF reader for matlab v7.3 files
Run Code Online (Sandbox Code Playgroud)
所以任何人都可以遇到同样的问题,并可以取悦任何示例代码
谢谢
<=>在C++ 20中有一个新的比较运算符.但是我认为在大多数情况下,简单的减法效果很好:
int my_strcmp(const char *a, const char *b) {
while (*a == *b && *a != 0 && *b != 0) {
a++, b++;
}
// Version 1
return *a - *b;
// Version 2
return *a <=> *b;
// Version 3
return ((*a > *b) - (*a < *b));
}
Run Code Online (Sandbox Code Playgroud)
它们具有相同的效果.我无法理解其中的差异.
假设我有一个NxN矩阵A,一个由数字1:N的子集和一个值K组成的索引向量V,我想这样做:
for i = V
A(i,i) = K
end
Run Code Online (Sandbox Code Playgroud)
有没有办法在一个带矢量化的声明中做到这一点?
例如A(某事)= K.
该声明A(V,V) = K不起作用,它分配非对角元素,这不是我想要的.例如:
>> A = zeros(5);
>> V = [1 3 4];
>> A(V,V) = 1
A =
1 0 1 1 0
0 0 0 0 0
1 0 1 1 0
1 0 1 1 0
0 0 0 0 0
Run Code Online (Sandbox Code Playgroud) 我有大约200个灰度PNG图像存储在这样的目录中.
1.png
2.png
3.png
...
...
200.png
Run Code Online (Sandbox Code Playgroud)
我想将所有PNG图像导入Numpy然后想要应用k-means来使用k-means(scikit)生成补丁字典
有没有人知道一个python库可以将这些图像加载到numpy中?
Matlab/Octave算法示例:
input vector: [ 1 0 2 0 7 7 7 0 5 0 0 0 9 ]
output vector: [ 1 1 2 2 7 7 7 7 5 5 5 5 9 ]
Run Code Online (Sandbox Code Playgroud)
该算法非常简单:它遍历向量并用最后一个非零值替换所有零.这似乎是微不足道的,并且当使用缓慢的(i = 1:长度)循环并且能够引用前一个元素(i-1)时是如此,但看起来不可能以快速矢量化形式表达.我尝试了merge()和shift()但它只适用于第一次出现的零,而不是任意数量的它们.
可以在Octave/Matlab中以矢量化形式完成,还是必须使用C才能在大量数据上获得足够的性能?
谢谢,Pawel
PS:我有另一个类似的慢速for循环算法加速,似乎通常不可能以矢量化形式引用先前的值,如SQL lag()或group by或loop(i-1)很容易做到.但Octave/Matlab循环速度非常慢.
有没有人找到这个一般问题的解决方案,或者这对于基本的Octave/Matlab设计原因是徒劳的?
==========编辑===============
绩效基准:
====解决方案1(慢循环)
in = repmat([ 1 0 2 0 7 7 7 0 5 0 0 0 9 ] ,1 ,100000);
out = in;
tic
for i=2:length(out)
if (out(i)==0)
out(i)=out(i-1);
end
end
toc …Run Code Online (Sandbox Code Playgroud) Herb Sutter在他的"宇宙飞船"运营商提案(第12.2节,第12页底部)中说:
基于所有内容
<=>及其返回类型:此模型具有主要优势,与先前的C++提议和其他语言的功能相比,此提案有一些独特之处:[...]
(6)效率,包括最终实现用于比较的零开销抽象:绝大多数比较总是单通道.唯一的例外是生成,
<=并且>=在支持部分排序和相等的类型的情况下.对于<单通是基本实现了零开销的原则,以避免重复平等的比较,如struct Employee { string name; /*more members*/ };在使用的struct Outer { Employeee; /*more members*/ };-今天的对比违反零开销抽象,因为operator<在Outer执行冗余相等比较,因为它执行if (e != that.e) return e < that.e;横贯平等前缀e.name两次(如果名称相同,则遍历Employee两次其他成员的相等前缀),这通常无法优化.正如Kamiński所指出的,零开销抽象是C++的支柱,并且首次实现它的比较是这种设计的一个重要优势<=>.
但他给出了这个例子(第1.4.5节,第6页):
class PersonInFamilyTree { // ...
public:
std::partial_ordering operator<=>(const PersonInFamilyTree& that) const {
if (this->is_the_same_person_as ( that)) return partial_ordering::equivalent;
if (this->is_transitive_child_of( that)) return partial_ordering::less;
if (that. …Run Code Online (Sandbox Code Playgroud) 我想知道如何遍历图像的所有像素.我试过这个:
import cv2
import numpy as np
x = np.random.randint(0,5,(500,500))
img = cv2.imread('D:\Project\Capture1.jpg',0)
p = img.shape
print p
rows,cols = img.shape
for i in range(rows):
for j in range(cols):
k = x[i,j]
print k
Run Code Online (Sandbox Code Playgroud)
它打印一组垂直数字,不是数组的形式.我也得到一个超出范围的数组异常.请建议一种方法.
在测试是否any()短路时(确实如此!)我在预分配测试变量时发现了以下有趣的行为:
test=zeros(1e7,1);
>> tic;any(test);toc
Elapsed time is 2.444690 seconds.
>> test(2)=1;
>> tic;any(test);toc
Elapsed time is 0.000034 seconds.
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
test=ones(1e7,1);
test(1:end)=0;
tic;any(test);toc
Elapsed time is 0.642413 seconds.
>> test(2)=1;
>> tic;any(test);toc
Elapsed time is 0.000021 seconds.
Run Code Online (Sandbox Code Playgroud)
事实证明,这是因为变量在完全填充信息之前并不真正在RAM上,因此第一次测试需要更长时间,因为它需要分配它.我检查这个的方法是查看Windows任务管理器中使用的内存.
虽然这可能有些意义(不要在需要之前进行初始化),但让我更加困惑的是下面的测试,其中变量填充在for循环中,并且在某些时候执行被停止.
test=zeros(1e7,1);
for ii=1:1e7
test(ii)=1;
if ii==1e7/2
pause
end
end
Run Code Online (Sandbox Code Playgroud)
在检查MATLAB使用的内存时,我可以看到当停止时,它只使用了50%的test所需内存(如果已满).这可以用不同的记忆百分比再现.
有趣的是,以下内容也没有分配整个矩阵.
test=zeros(1e7,1);
test(end)=1;
Run Code Online (Sandbox Code Playgroud)
我知道MATLAB不是动态分配和增加test循环的大小,因为这会使结束迭代非常慢(由于需要高memcopys),并且它也会在我提出的最后一次测试中分配整个数组.所以我的问题是:
到底是怎么回事?
有人建议这可能与虚拟内存和物理内存有关,并且与操作系统看待内存的方式有关.不知道如何链接到这里提出的第一个测试.任何进一步的解释都是理想的.
赢得10 x64,MATLAB 2017a