我想用haskell的向量库有效地操纵矩阵(完整或稀疏).
这是一种矩阵类型
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector as V
data Link a = Full (V.Vector (U.Vector a))
| Sparse (V.Vector (U.Vector (Int,a)))
type Vector a = U.Vector a
Run Code Online (Sandbox Code Playgroud)
如您所见,矩阵是未装箱矢量的矢量.现在,我想在矢量和矩阵之间做一个点积.通过组合sum,zip和map可以非常简单.
但是,如果我这样做,因为我正在映射矩阵的行,结果是一个盒装矢量,即使它可以是未装箱的.
propagateS output (Field src) (Full weights) = V.map (sum out) weights
where out = U.map output src
sum s w = U.sum $ zipWithFull (*) w s
propagateS output (Field src) (Sparse weights) = V.map (sum out) weights
where out = U.map output src
sum s w …Run Code Online (Sandbox Code Playgroud) 在对这个问题的公认最佳回答中,有一个明确的解释为什么拳击发生.
但是,如果我反编译代码(使用java反编译器),我看不到使用scala.runtime.BoxesRunTime.此外,如果我分析代码(使用JProfiler),我看不到BoxesRunTime的任何实例.
那么,我怎么能真正看到拳击/拆箱的证据呢?
我很难理解这一点.请考虑以下示例:
protected void Page_Load(object sender, EventArgs e)
{
// No surprise that this works
Int16 firstTest = Convert.ToInt16(0);
int firstTest2 = (int)firstTest;
// This also works
object secondTest = 0;
int secondTest2 = (int)secondTest;
// But this fails!
object thirdTest = Convert.ToInt16(0);
int thirdtest2 = (int)thirdTest; // It blows up on this line.
}
Run Code Online (Sandbox Code Playgroud)
我在运行时获得的具体错误是在Visual Studio中的Specified cast is not valid. If I QuickWatch (int)thirdTest,我得到的值为Cannot unbox 'thirdTest' as a 'int'.
到底发生了什么事?
我正在尝试转换一个
Expression<Func<T,object>>
Run Code Online (Sandbox Code Playgroud)
到了
Expression<Func<T,bool>>
Run Code Online (Sandbox Code Playgroud)
目前,手表向我显示我的表情
Expression<Func<T,object>> myExpression = model=>Convert(model.IsAnAirplane)
Run Code Online (Sandbox Code Playgroud)
我想简化这个
Expression<Func<T,bool>> myExpression = model=>model.IsAnAirplane
Run Code Online (Sandbox Code Playgroud)
目前我只成功添加转换,导致:
Expression<Func<T,bool>> myExpression = model=>Convert(Convert(model.IsAnAirplane))
Run Code Online (Sandbox Code Playgroud)
但由于底层类型是一个bool,我应该能够完全划伤转换器,对吧?我熟悉表达式访问者等,但仍然无法弄清楚如何删除转换.
编辑:这个问题的接受答案表达式<Func <T,对象>>到表达式<Func <T,TResult >>(可能是重复的)的通用拆箱对我来说不起作用...作为表达式由EF翻译,你可以看到它转换(转换())而不是只删除第一个转换...,这导致"无法转换类型'System.Boolean'来键入'System.Object'.LINQ to Entities仅支持转换EDM原语或枚举类型."
参考:http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
"如果你的程序尝试autounbox null,它将抛出NullPointerException."
如果尝试将null赋给布尔值,javac将给出编译时错误.说得通.尽管如此,将null赋给布尔值也是如此.我猜也是有道理的.
但是让我们考虑一下这样一个事实:当你尝试autounbox null时你会得到一个NPE.这意味着你不能在没有空值检查或异常处理的情况下安全地对布尔值执行布尔运算.在整数上进行数学运算也是如此.
很长一段时间,我是java1.5 +中自动装箱的粉丝,因为我认为它让java更接近真正的面向对象.但是,昨晚遇到这个问题之后,我得说我认为这很糟糕.当我尝试使用未初始化的原语时,编译器给我一个错误是一件好事.如果我输了,我不想使用自动装箱.
我想我可能误解了自动装箱的问题,但与此同时我永远不会接受布尔值应该能够有3个值.谁有人解释这个?我没有得到什么?
考虑以下::
Object box = 5;
int @int = (int)box; // int = 5
int? nullableInt = box as int?; // nullableInt = 5;
StringComparison @enum = (StringComparison)box; // enum = OrdinalIgnoreCase
StringComparison? nullableEnum = box as StringComparison?; // nullableEnum = null.
Run Code Online (Sandbox Code Playgroud)
2件事::
StringComparison?我想这是因为它的底层类型是,Int32但我仍然觉得它很奇怪.nullableEnum值为null?据我所知,唯一有效的拆箱是从盒装值类型到它的类型或可空类型.如果int可以取消装箱Enum,那么为什么不能同样适用于可空值?同样,如果不是5我装盒StringComparison.OrdinalIgnoreCase,那nullableInt将是null,但nullableEnum不会.
背景:我正在为xbox开发,并处于启动阶段.我需要减少对象分配.一个开始的地方是找出(un)拳击发生的地方.
我是IL的新手(因为我从未查看过任何内容!)并且希望避免通过反汇编程序运行DLL,寻找(un)box命令然后尝试找出它涉及的代码行.
问题:是否有任何工具可以报告此类事件(发生(联合国)拳击事件)?
将GC堆转储绑定到对象创建发生的代码行的方法有很多很多奖励点!
这是一个测试程序:
main = do
n <- fmap read $ getLine :: IO Int
if (999999 == n) then putStrLn "equal" else return ()
Run Code Online (Sandbox Code Playgroud)
以下是编译时的相关核心位ghc --make -O2 -ddump-to-file -ddump-simpl -dsuppress-module-prefixes -dsuppress-uniques -ddump-core-stats -ddump-inlinings:
case readEither6 @ Int (run @ Int main3 ipv1) of _ [Occ=Dead] {
[] -> case error @ Int readEither4 of wild1 { };
: x ds1 ->
case ds1 of _ [Occ=Dead] {
[] ->
case x of _ [Occ=Dead] { I# ipv2 ->
case …Run Code Online (Sandbox Code Playgroud) 我有以下退货声明:
public Boolean foo(String booleanString){
return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? false : null));
}
Run Code Online (Sandbox Code Playgroud)
如果booleanString不相等true而不是false我得到了NullPointerException.
是拳击/拆箱问题吗?
假设我有一个简单的数据类型,如:
data Cell = Open | Blocked
Run Code Online (Sandbox Code Playgroud)
我想用一个UArray Int Cell.是否有捷径可寻?我可以以某种方式重用该定义UArray Int Bool吗?