2015-06-08 29 views
6

Với x = Any[[1,2],[2,3],[3,4],[4,5]], tôi đã thử dòng sau với Julia0.4.0Matching của các phần tử mảng trong Julia

x[ x .== [3,4] ] 

nhưng nó dẫn đến một lỗi

ERROR: DimensionMismatch("arrays could not be broadcast to a common size") 

tôi mong đợi nó để cung cấp cho một cái gì đó giống như Any[ [3,4] ]

x[3] == [3,4] # => true 

không có vấn đề gì. Mặc dù hoạt động này chính nó có thể không hữu ích, tôi muốn biết những gì các thông báo lỗi có nghĩa là. Vì vậy, tôi sẽ đánh giá cao bất kỳ gợi ý nào tại sao lỗi này xảy ra.

Trả lời

5

Để so sánh từng phần tử, Julia yêu cầu cả hai mảng đều có cùng số phần tử. Điều này có thể đạt được trong trường hợp này với một sự hiểu biết:

julia> x = Any[[1,2],[2,3],[3,4],[4,5]] 
4-element Array{Any,1}: 
[1,2] 
[2,3] 
[3,4] 
[4,5] 

julia> x[x.==[[3,4] for i in 1:length(x)]] 
1-element Array{Any,1}: 
[3,4] 

Vì vậy, các câu hỏi trong tâm trí của tôi là "tại sao không Julia phát sóng [3,4] thành hình này tự động?". Ví dụ sau đây được phát sóng một cách chính xác:

julia> y = [1,2,3,4] 
4-element Array{Int64,1}: 
1 
2 
3 
4 

julia> y.==3 
4-element BitArray{1}: 
false 
false 
    true 
false 

julia> y[y.==3] 
1-element Array{Int64,1}: 
3 

Dường như cơ chế phát sóng của Julia là không thể suy ra rằng chúng tôi muốn [3,4] để được phát sóng vào [[3,4],[3,4],[3,4],[3,4]] hơn là một số hình dạng khác của mảng.

+1

Cảm ơn bạn rất nhiều vì đã giải thích. Bây giờ tôi hiểu những gì "phát sóng" có nghĩa là trong thông báo lỗi này. Tôi cũng xác nhận rằng '@show x [x. == [[3,4] cho i = 1: length (x)]] => Bất kỳ [[3,4]]' (điều này đã là một bất ngờ lớn đối với tôi !) Tương tự như vậy, 'x. == 1',' x. == "hi" ', và' x. == [1] 'tất cả đều làm việc (đưa ra một' Bất kỳ [] 'trống nào. Vì vậy, có vẻ Julia không hài lòng với điều này [3,4] 'hoặc những người tương tự ... – roygvib

3

Bạn có thể giúp Julia một chút trong việc tìm hiểu làm thế nào để phát sóng biến thứ hai bằng cách viết so sánh như thế này:

julia> x .== Any[[3, 4]] 

Bạn nhận được một BitArray ra như mong đợi:

4-element BitArray{1}: 
false 
false 
    true 
false 

Vì vậy, lập chỉ mục với kết quả của so sánh cũng vậy:

julia> x[ x .== Any[[3,4]] ] 
1-element Array{Any,1}: 
[3,4] 
Các vấn đề liên quan