我想知道是否:
a = "abcdef"
b = "def"
if a[3:] == b:
print("something")
Run Code Online (Sandbox Code Playgroud)
实际上是否执行了a内存中某处“def”部分的副本,或者是否就地完成了字母检查?
注意:我说的是一个字符串,而不是一个列表(我知道答案)
memoryview的完整描述可以在这里找到:
创建一个
memoryview引用obj.obj必须支持缓冲协议.支持缓冲协议的内置对象包括bytes和bytearray.A
memoryview具有元素的概念,元素是由始发对象obj处理的原子存储单元.对于许多简单类型,例如bytes和bytearray,元素是单个字节,但是其他类型array.array可能具有更大的元素.
自MATLAB R2018a以来,复值矩阵在内部存储为单个数据块,每个矩阵元素的实部和虚部存储在彼此相邻的位置 - 它们称之为"交错复合体".(以前这样的矩阵有两个数据块,一个用于所有实际组件,一个用于所有虚构组件 - "单独复杂".)
我认为,由于存储现在允许它,因此应该可以将复值数组转换为具有两倍元素的实值数组,而无需复制数据.
MATLAB有一个函数typecast,它将数组转换为不同类型而不复制数据.例如,它可以用于将具有16个8位值的数组转换为具有2个双浮点数的数组.它在不复制数据的情况下执行此操作,将位模式重新解释为新类型.
遗憾的是,这个函数在复值数组上根本不起作用.
我想复制这段代码:
A = fftn(randn(40,60,20)); % some random complex-valued array
assert(~isreal(A))
sz = size(A);
B = reshape(A,1,[]); % make into a vector
B = cat(1,real(B),imag(B)); % interleave real and imaginary values
B = reshape(B,[2,sz]); % reshape back to original shape, with a new first dimension
assert(isreal(B))
Run Code Online (Sandbox Code Playgroud)
矩阵A和B(在R2018a和更新版本中)完全相同的数据,完全相同的顺序.但是,为了达到目的,B我们必须将数据复制两次.
我尝试创建一个MEX文件来执行此操作,但我没有看到如何创建一个引用输入数组中的数据的新数组.这个MEX文件有效,但是在清除变量时会导致MATLAB崩溃,因为有两个数组引用相同的数据而没有意识到它们共享数据(即引用计数没有递增).
// Build with:
// mex -R2018a typecast_complextoreal.cpp
#include <mex.h>
#if MX_HAS_INTERLEAVED_COMPLEX==0
#error "This MEX-file …Run Code Online (Sandbox Code Playgroud)