我有兴趣根据2个其他向量中的值对矩阵的列进行排序.举个例子,假设矩阵和向量看起来像这样:
M = [ 1 2 3 4 5 6 ;
7 8 9 10 11 12 ;
13 14 15 16 17 18 ]
v1 = [ 2 , 6 , 6 , 1 , 3 , 2 ]
v2 = [ 3 , 1 , 2 , 7 , 9 , 1 ]
Run Code Online (Sandbox Code Playgroud)
我想的排序列A
在其相应的值方面v1
和v2
与v1
优先于v2
.另外,我很感兴趣,试图矩阵排序的地方,因为我一起工作的矩阵是非常大的.目前,我的原始解决方案如下:
MM = [ v1' ; v2' ; M ] ; ## concatenate …
Run Code Online (Sandbox Code Playgroud) 我已经在Julia工作了几个月了,我有兴趣并行写一些代码.我正在研究一个问题,我使用1个模型为几个不同的接收器生成数据(每个接收器的数据是一个向量).每个接收器的数据可以独立计算,这使我相信我应该能够使用pmap函数.我的计划是将数据初始化为2D SharedArray(每列代表1个接收器的数据),然后在每个列上进行pmap循环.但是我发现将SharedArray与pmap一起使用并不比使用map的串行工作快.我写了下面的虚拟代码来说明这一点.
@everywhere function Dummy(icol,model,data,A,B)
nx = 250
nz = 250
nh = 50
for ih = 1:nh
for ix = 1:nx
for iz = 1:nz
data[iz,icol] += A[iz,ix,ih]*B[iz,ix,ih]*model[iz,ix,ih]
end
end
end
end
function main()
nx = 250
nz = 250
nh = 50
nt = 500
ncol = 100
model1 = rand(nz,nx,nh)
model2 = copy(model1)
model3 = convert(SharedArray,model1)
data1 = zeros(Float64,nt,ncol)
data2 = SharedArray(Float64,nt,ncol)
data3 = SharedArray(Float64,nt,ncol)
A1 = rand(nz,nx,nh)
A2 = copy(A1)
A3 = convert(SharedArray,A1)
B1 = rand(nz,nx,nh) …
Run Code Online (Sandbox Code Playgroud) 我正在使用大型数据矩阵(Nrow x Ncol),这些数据太大而无法存储在内存中.相反,在我的工作领域中将数据保存到二进制文件中是标准的.由于工作的性质,我只需要一次访问矩阵的1列.我还需要能够修改列,然后将更新的列保存回二进制文件.到目前为止,我已经设法弄清楚如何将矩阵保存为二进制文件以及如何从二进制文件中读取矩阵的1'列'到内存中.但是,在我编辑列的内容后,我无法弄清楚如何将该列保存回二进制文件.
例如,假设数据文件是已保存到磁盘的32位标识矩阵.
Nrow = 500
Ncol = 325
data = eye(Float32,Nrow,Ncol)
stream_data = open("data","w")
write(stream_data,data[:])
close(stream_data)
Run Code Online (Sandbox Code Playgroud)
从磁盘读取整个文件,然后重新变换回矩阵非常简单:
stream_data = open("data","r")
data_matrix = read(stream_data,Float32,Nrow*Ncol)
data_matrix = reshape(data_matrix,Nrow,Ncol)
close(stream_data)
Run Code Online (Sandbox Code Playgroud)
正如我之前所说,我使用的数据矩阵太大而无法读入内存,因此上面编写的代码通常无法执行.相反,我需要一次使用1列.以下是将矩阵的1列(例如第7列)读入内存的解决方案:
icol = 7
stream_data = open("data","r")
position_data = 4*Nrow*(icol-1)
seek(stream_data,position_data)
data_col = read(stream_data,Float32,Nrow)
close(stream_data)
Run Code Online (Sandbox Code Playgroud)
请注意,'position_data'变量中的系数'4'是因为我正在使用Float32.另外,我不完全理解seek命令在这里做了什么,但它似乎根据以下测试给出了正确的输出:
data == data_matrix # true
data[:,7] == data_col # true
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我想确定我加载的列(即第7列)需要用零替换:
data_col = zeros(Float32,size(data_col))
Run Code Online (Sandbox Code Playgroud)
现在的问题是弄清楚如何将此列保存回二进制文件而不影响任何其他数据.当然我打算用'write'来执行这个任务.但是,我不完全确定如何继续.我知道我需要从打开数据流开始; 但是我不确定我需要使用什么'模式':"w","w +","a"或"a +"?这是使用"w"失败的尝试:
icol = 7
stream_data = open("data","w")
position_data = 4*Nrow*(icol-1)
seek(stream_data,position_data)
write(stream_data,data_col)
close(stream_data)
Run Code Online (Sandbox Code Playgroud)
原始二进制文件(在我尝试编辑二进制文件失败之前)在磁盘上占用了650000个字节.这与矩阵的大小为500x325且Float32的数量占4个字节(即4*500*325 = 650000)的事实一致.但是,在我尝试编辑二进制文件后,我发现二进制文件现在只占用14000字节的空间.一些快速的心理数学表明,14000字节对应于7列数据(4*500*7 = 14000).快速检查确认二进制文件已使用大小为500x7的新矩阵替换了所有原始数据,其元素全部为零. …
我想弄清楚(在Julia中)当维度本身是一个变量时,如何沿着指定的维度提取数组的一部分.如果维度已知,则可以直接提取数组的一部分.例如,我可以通过执行以下操作来提取第3维的一部分:
A = rand(27,33,11)
A_portion = A[:,:,3:7]
Run Code Online (Sandbox Code Playgroud)
是否有一种紧凑/有效的方法来沿可变维度提取数组的一部分?例如,看起来像这样的东西?
A = rand(27,33,11)
dim = 3 ## dimension along which to grab a portion of the array
first_element = 3 ## first element over specified dimension
last_element = 7 ## last element over specified dimension
A_portion = MyFunction(A,dim,first_sample,last_sample)
Run Code Online (Sandbox Code Playgroud)
一种可能性是为数组维度的每个可能组合(最多一些最大维数)和提取该部分的维度编写一组if语句.例如,像这样:
MyFunction(A::Array,dim::Int,first_element::Int,last_element::Int)
if ndims(A)==1 && dim==1
return A[first_element:last_element]
elseif ndims(A)==2 && dim==1
return A[first_element:last_element,:]
elseif ndims(A)==2 && dim==2
return A[:,first_element:last_element]
elseif ndims(A)==3 && dim==1
...
...
...
Run Code Online (Sandbox Code Playgroud)
显然,为了允许具有大量维度的阵列,这变得非常混乱.这样做有更紧凑/更有效的方法吗?
我正在使用Julia中的PyPlot包来生成并保存多个图形。我当前的方法是显示图形,然后使用保存savefig
。
using PyPlot
a = rand(50,40)
imshow(a)
savefig("a.png")
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以保存图形而不必先显示它?
我有一个Julia函数,它接受一些输入参数并使用它们来执行多个操作.为了使其中一个操作正常工作,我需要能够计算与用户输入匹配的符号.例如,函数看起来像这样:
function func(arg1,arg2)
symb_arg1 = ## get the symbol for input into arg1
symb_arg2 = ## get the symbol for input into arg2
println(symb_arg1)
println(symb_arg2)
## Do some operations using arg1, arg2, symb_arg1, symb_arg1
end
Run Code Online (Sandbox Code Playgroud)
我希望实现以下行为:
a = 25
b = rand(27,55,18)
func(a,b) ## prints :a and :b
Run Code Online (Sandbox Code Playgroud)
这里的困难是让函数计算包含变量实际名称的符号,而不是变量的值.这篇文章提供了以下几乎可以实现我想要的宏:
macro mymacro(ex)
Expr(:quote,ex) # this creates an expression that looks like :(:(x + 2))
end
Run Code Online (Sandbox Code Playgroud)
此宏适用于执行以下操作:
a = rand(27,15)
symb_a = @mymacro(a) ## prints :a
Run Code Online (Sandbox Code Playgroud)
但是,在我的函数中使用此宏将不会产生所需的效果.具体来说,如果我将我的函数定义为:
function func_bad(arg1,arg2)
symb_arg1 …
Run Code Online (Sandbox Code Playgroud)