Ich würde gerne eine Shuffling-Methode für eine Matrix von Nullen und Einsen implementieren, die zufällige 2x2 Submatrizen und flippt sie nur, wenn sie ihre Kolumnen und Zeilensummen sind gleich, d.h. [0 1; 1 0] oder [1 0; 0 1].Raster Marginals Mischen in Julia - Bessere Implementierung
EDIT: Zu Ihrer Information soll dies bedeuten, dass beiden
sum(matrix,1) == sum(shuffledmatrix,1) &&
sum(matrix,2) == sum(shuffledmatrix,2)
==> true
Der folgende Code korrekt ist, aber im Grunde ist einfach nicht schnell genug. Kann hier jemand eklatante Fehler sehen? (Ich bin ziemlich neu in Julia!)
function rastershuffle!(shuffledmatrix::Array{Int32,2},minchanges::Int)
@inbounds begin
numchanges = 0
numcols = size(shuffledmatrix,2)
numrows = size(shuffledmatrix,1)
while numchanges < minchanges
a = findmargeflip!(shuffledmatrix,numcols::Int, numrows::Int)
numchanges = numchanges + sum(a)
end
end
return shuffledmatrix
end
function findmargeflip!(shuffledmatrix::Array{Int32,2},numcols::Int, numrows::Int)
change = false
cols = EPhys.random_generator(2,numcols)
rows = EPhys.random_generator(2,numrows)
vall = sub(shuffledmatrix, [rows[1]; rows[2]],[cols[1]; cols[2]])
if vall == [0 1; 1 0] || vall == [1 0; 0 1]
flipvall!(vall)
#numchanges += 1
change = true
end
change
end
function flipvall!(vall)
if vall[1] == 1
vall[:] = [0 1 1 0]
else
vall[:] = [1 0 0 1]
end
nothing
end
Was ich versucht habe bisher auf der Grundlage der Informationen in der Dokumentation:
Mit BitArrays statt Int32 - nicht viel machen Unterschied, obwohl ich das sowieso ändern kann, die Funktion flipvall! Kann dann auch einfach durch Flipbits ersetzt werden!
gibt die Compiler zusätzliche Typinformationen
eine Anzahl von Iterationen im Gegensatz zu Änderungen einstellen und dann vektorisieren versuchen, mit @simd
Ich denke, der Hauptflaschenhals erneut Erzeugungs das SubArray bei jeder Iteration, die eine erneute Speicherzuweisung/Speicherbereinigung erfordert, aber ich bin nicht ganz sicher, wie ich das umgehen soll.
Extra Info:
shuffledspikematrix3 = copy(spikematrixnonoise)
@time rastershuffle!(shuffledspikematrix3, 100);
@profile rastershuffle!(shuffledspikematrix3, 100);
Profile.print()
===> OUTPUT:
8.776213 seconds (153.35 M allocations: 7.835 GB, 15.94% gc time)
1 abstractarray.jl; ==; line: 1060
1 abstractarray.jl; hvcat; line: 974
2 abstractarray.jl; vcat; line: 733
2 array.jl; getindex; line: 282
2 multidimensional.jl; start; line: 99
800 task.jl; anonymous; line: 447
800 .../IJulia/src/IJulia.jl; eventloop; line: 143
800 ...rc/execute_request.jl; execute_request_0x535c5df2; line: 183
800 loading.jl; include_string; line: 266
800 profile.jl; anonymous; line: 16
800 In[174]; rastershuffle!; line: 7
1 ...devel/src/helper.jl; random_generator; line: 52
1 In[174]; findmargeflip!; line: 15
77 In[174]; findmargeflip!; line: 16
13 ....devel/src/helper.jl; random_generator; line: 44
7 random.jl; rand; line: 255
5 random.jl; gen_rand; line: 88
1 dSFMT.jl; dsfmt_fill_array_close1_open2!; line: 66
4 dSFMT.jl; dsfmt_fill_array_close1_open2!; line: 67
2 random.jl; rand; line: 256
47 ....devel/src/helper.jl; random_generator; line: 47
1 ....devel/src/helper.jl; random_generator; line: 48
13 ....devel/src/helper.jl; random_generator; line: 49
1 ....devel/src/helper.jl; random_generator; line: 52
86 In[174]; findmargeflip!; line: 17
9 ....devel/src/helper.jl; random_generator; line: 44
5 random.jl; rand; line: 255
4 random.jl; gen_rand; line: 88
4 dSFMT.jl; dsfmt_fill_array_close1_open2!; line: 67
1 random.jl; rand; line: 256
53 ....devel/src/helper.jl; random_generator; line: 47
1 ....devel/src/helper.jl; random_generator; line: 48
13 ....devel/src/helper.jl; random_generator; line: 49
2 ....devel/src/helper.jl; random_generator; line: 52
211 In[174]; findmargeflip!; line: 19
87 abstractarray.jl; vcat; line: 733
9 subarray.jl; _sub; line: 90
35 subarray.jl; _sub; line: 91
1 subarray.jl; _sub_unsafe; line: 96
21 subarray.jl; _sub_unsafe; line: 125
1 subarray.jl; _sub_unsafe; line: 437
1 subarray.jl; _sub_unsafe; line: 440
411 In[174]; findmargeflip!; line: 20
5 abstractarray.jl; ==; line: 1060
4 abstractarray.jl; ==; line: 1066
258 abstractarray.jl; ==; line: 1067
4 abstractarray.jl; ==; line: 1068
2 abstractarray.jl; hvcat; line: 957
87 abstractarray.jl; hvcat; line: 960
1 abstractarray.jl; hvcat; line: 961
2 abstractarray.jl; hvcat; line: 969
3 abstractarray.jl; hvcat; line: 970
11 abstractarray.jl; hvcat; line: 971
1 abstractarray.jl; hvcat; line: 974
4 In[174]; findmargeflip!; line: 25
1 abstractarray.jl; ==; line: 1060
2 abstractarray.jl; hvcat; line: 960
1 abstractarray.jl; vcat; line: 733
1 tuple.jl; ==; line: 95
3 tuple.jl; ==; line: 96
Die erste Zuweisung zu 'vall' in' findmargeflip! 'Ist unnötig und verwirrt möglicherweise den Compiler. –
Ja nicht sicher, warum diese Linie da war! –